| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Viewport (4015 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 09. Jun. 2010 22:08 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich möchte gerne, nachdem ich einen Viewport erstellt habe in den Modellbereich schauen mittels
Code: Acaddocument.Editor.SwitchToModelspace
Danach möchte ich für den Viewport den Bereich Zoomen, der angezeigt werden soll. Ich bekomme aber nach
Code: Acaddocument.Editor.SwitchToModelspace
den Fehler eInvalidInput Hier die Erstellung des ViewPorts, ich habe viel Beispielcode im Internet gefunden, die es genau so machen, aber es klappt nicht. Code: Dim acVport As Viewport = New Viewport() acVport.SetDatabaseDefaults() acVport.CenterPoint = New Geometry.Point3d((la.BorderMaxPoint.X) / 2, (la.BorderMaxPoint.Y) / 2, 0) acVport.Width = la.BorderMaxPoint.X - la.BorderWidthRight * 2 acVport.Height = la.BorderMaxPoint.Y - la.BorderWidthRight * 2layoutblockdef.AppendEntity(acVport) trAct.AddNewlyCreatedDBObject(acVport, True) acVport.ViewDirection = New Geometry.Vector3d(0, 0, 1) 'von oben drauf schauen acVport.ColorIndex = 1 'rot acVport.CustomScale = oldscale 'acVport.StandardScale = StandardScaleType.CustomScale acVport.ViewTarget = New Geometry.Point3d(X, Y, 0) acVport.On = True AcadDoc.Editor.SwitchToModelSpace() 'Hier kommt der Fehler AcadDoc.Editor.SwitchToPaperSpace() AcadDoc.Editor.Regen() retval = True
mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Jun. 2010 22:41 <-- editieren / zitieren -->
Hi, ich vermute mal eine von 2 Möglichkeiten (zumindest mal 2, die mir jetzt einfallen): a) Du stehst nicht im Layout, von dem Du sprichst/schreibst/Dein Ansichtsfenster erstellst b) Du hast die Transaction noch nicht abgeschlossen, daher gibt es noch keine Möglichkeit, auf Modellbereich des Ansichtsfensters umzuschalten, wenn das Ansichtsfenster noch nicht in der Datenbank existiert. Nicht probiert, nur gelesen, also lass mich wissen, wenn ich falsch liege. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Jun. 2010 07:59 <-- editieren / zitieren --> Unities abgeben:
Also der erste Punkt ist ausgeschlossen, da ich dass Layout extra noch aktiviere. Punkte 2 wäre eine Möglichkeit, aber wenn ich es so mache, bekomme ich den Fehler Code:
eCannotChangeActiveViewport
Ist der gerade erzeugte Viewport nicht automatisch aktiv wenn ich ihn vp.ON=true schalte? Code:
acaddoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument trans = acaddoc.TransactionManager.StartTransaction()Dim acVport As Viewport = New Viewport() acVport.SetDatabaseDefaults() acVport.CenterPoint = New Geometry.Point3d((la.BorderMaxPoint.X) / 2, (la.BorderMaxPoint.Y) / 2, 0) acVport.Width = la.BorderMaxPoint.X - la.BorderWidthRight * 2 acVport.Height = la.BorderMaxPoint.Y - la.BorderWidthRight * 2 layoutblockdef.AppendEntity(acVport) trans.AddNewlyCreatedDBObject(acVport, True) acVport.ViewDirection = New Geometry.Vector3d(0, 0, 1) 'von oben drauf schauen acVport.ColorIndex = 1 'rot acVport.CustomScale = oldscale 'acVport.StandardScale = StandardScaleType.CustomScale acVport.ViewTarget = New Geometry.Point3d(X, Y, 0) acVport.On = True trans.Commit() AcadDoc.Editor.SwitchToModelSpace() 'Hier kommt der Fehler AcadDoc.Editor.SwitchToPaperSpace() AcadDoc.Editor.Regen()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2010 08:09 <-- editieren / zitieren -->
Hi, dieses läuft bei mir ohne Fehler durch, wenn ich mich vorher auf z.B. 'Layout1' gestellt habe: Code: <Runtime.CommandMethod("test", Runtime.CommandFlags.Session)> _ Public Shared Sub test() Dim tAcadDoc as ApplicationServices.Document = AN_Tools_AcadFunctions.AN_getActiveAcadDoc Dim tDocLock As ApplicationServices.DocumentLock = tAcadDoc.LockDocument Dim tTrAct As DatabaseServices.Transaction = tAcadDoc.TransactionManager.StartTransaction Dim tLayoutMgr As DatabaseServices.LayoutManager = DatabaseServices.LayoutManager.Current Dim tLayoutID As DatabaseServices.ObjectId = tLayoutMgr.GetLayoutId(tLayoutMgr.CurrentLayout) Dim tLayout As DatabaseServices.Layout = CType(tTrAct.GetObject(tLayoutID, DatabaseServices.OpenMode.ForRead), DatabaseServices.Layout) Dim tLayoutBlock As DatabaseServices.BlockTableRecord = CType(tTrAct.GetObject(tLayout.BlockTableRecordId, DatabaseServices.OpenMode.ForWrite), DatabaseServices.BlockTableRecord)
Dim acVport As DatabaseServices.Viewport = New DatabaseServices.Viewport() acVport.SetDatabaseDefaults() acVport.CenterPoint = New Geometry.Point3d(50, 50, 0) acVport.Width = 100 acVport.Height = 100 tLayoutBlock.AppendEntity(acVport) tTrAct.AddNewlyCreatedDBObject(acVport, True) acVport.ViewDirection = New Geometry.Vector3d(0, 0, 1) 'von oben drauf schauen acVport.ColorIndex = 1 'rot acVport.CustomScale = 1 'acVport.StandardScale = StandardScaleType.CustomScale acVport.ViewTarget = New Geometry.Point3d(10, 10, 0) acVport.On = True tTrAct.Commit() : tTrAct.Dispose() tDocLock.Dispose() : tDocLock = Nothing tAcadDoc.Editor.SwitchToModelSpace() 'Hier kommt der Fehler tAcadDoc.Editor.SwitchToPaperSpace() tAcadDoc.Editor.Regen() End Sub End Class
Also hat's entweder was mit den Werten (ich habe hier hardcoded Zahlen statt Deiner Variablen eingesetzt), mit Deiner LayoutBlockDef (die hab ich mir aus dem gerade aktuellen Layout geholt). - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Jun. 2010 09:31 <-- editieren / zitieren --> Unities abgeben:
Die Werte stimmen ganz genau. Ich habe jetzt 2 Varianten probiert. a:Eine Zeichnung wo ich einen Viewport erstelle und b:Eine Zeichnung wo ich 3 Viewports auf jeweils einem Layout erstelle. a: War ein Formel Fehler, eine Zeichnung mit einem Layout funktioniert einwandfrei b: Das Erste Layout funktioniert noch, beim 2 Layout sagt er dann wieder eCannotChangeActiveViewport. Es ist aber Layout 2 aktiv. Beim 3 passiert das gleiche wie bei Layout 2 kannst du mal bei dir probieren mehrere Layouts durchzulaufen und ein Zoom auf einen Bereich setzten? Um zu sehen ob er bei dir mehrere durchläuft und ob er die Anzeige auch nachher noch verschiebt. edit: Ich habe Zur Sichherheit noch das letzte erzeugte Objekt(VP) selectiert
Code:
acVport.On = True acVport.ViewTarget = New Geometry.Point3d(X, Y, 0) trans.Commit() trans.Dispose() trans = acaddoc.TransactionManager.StartTransaction() Dim res As EditorInput.PromptSelectionResult res = acaddoc.Editor.SelectLast()
mfg [Diese Nachricht wurde von veydan am 10. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Jun. 2010 11:01 <-- editieren / zitieren --> Unities abgeben:
Problem gelöst! Ich habe vor dem Zoom Fenster noch ein Zoom Grenzen gemacht, jetzt läuft es durch. Die Zeichnung war ursprünglich so weit hineingezoomt, dass man nur ca 1/5 der Zeichnung sah, da lag das Problem. Danke für die Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2010 11:54 <-- editieren / zitieren -->
Hi, zum einen natürlich: Super dass Du Dich durchgekämpft hast und draufgekommen bist, hätte ich hier ohne einer Deiner Zeichnungen dann wohl nie reproduzieren können. Andererseits würde ich es nicht verstehen, wozu ein ZOOM-Grenzen vorher notwendig sein sollte, ich sehe in Deinem Code leider nicht, wann Du einen ZOOM auslöst. Oder sprichst Du etwa davon, dass Du beim Wechsel auf das Layout den Layout-Bereich heranzoomst (vergiss bei diesem Wort bitte mein Deutsch ). - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Jun. 2010 12:42 <-- editieren / zitieren --> Unities abgeben:
Habe den letzten Code nicht mehr gepostet. Hier ist er: Code: acVport.On = True trans.Commit() trans.Dispose() trans = acaddoc.TransactionManager.StartTransaction() Dim res As EditorInput.PromptSelectionResult res = acaddoc.Editor.SelectLast() Dim acaddocument As AcadDocument = Application.DocumentManager.MdiActiveDocument.AcadDocument() acaddocument.SendCommand("_zoom _All ") acaddoc.Editor.SwitchToModelSpace() acaddocument.SendCommand("_zoom _Window " & X & "," & Y & " " & X1 & "," X2 & " ") acaddoc.Editor.SwitchToPaperSpace() acaddocument = Nothing trans.Commit()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jun. 2010 12:54 <-- editieren / zitieren -->
Hi, wird mir ohne Zeichnung aber trotzdem nicht gelingen. Zu Deiner Zeile: acaddocument.SendCommand("_zoom _Window " & X & "," & Y & " " & X1 & "," X2 & " ") Die wird nur funktionieren, wenn Du im Windows Deine Ländereinstellungen auf englisch hast und damit ein Dezimalpunkt und nicht ein Dezimalkomma ausgegeben wird. Würde nämlich X ausgegeben werden als 50,3 und Y als 30,75 ==> dann würde AutoCAD folgende Werte in die Befehlszeile bekommen: ZOOM _Window 50,3,30,75 ==> und das geht nicht muss 50.3,30.75 lauten Also meine Empfehlung dazu (dass Du einstellungsunabhängig wirst):
... X.ToString.Replace(",",".") - alfred -
------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Jun. 2010 12:57 <-- editieren / zitieren --> Unities abgeben:
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2011 12:32 <-- editieren / zitieren --> Unities abgeben:
hallo! Jetzt grabe ich den Code nochmal aus, da mir die SendCommand Methode nicht sonderlich gefällt habe ich etwas probiert und gesucht. Es muss ja auch eine Managed Variante geben um einem Viewport in eine bestimmte Ansicht zu zoomen. Ich habe hier ein Beispiel gefunden, das mit der editor.GetCurrentView Methode arbeitet. was ich jetzt noch nicht verstehe wie ich es richtig einsetzte... Und wie der Zusammenhang von Viewport, Viewtable und Viewtablerecord Objekten ist??? Wenn ich auf einem Layout einen Viewport erstellt habe, muss ich dann das Ansichtsfenster aktivieren und ins Modell springen um mit dieser Funktion arbeiten zu können? oder muss ich mir vom Viewport Objekt den ViewportTableRecord holen, und den bearbeiten? passieren tut bei mir nichts, wenn ich diese Funktion aufrufe, mit den Koordinaten des Modellbereichs den er anzeigen soll. Code:
Public Sub ZoomCurrentView(ByVal pMin As Geometry.Point3d, ByVal pMax As Geometry.Point3d, _ ByVal pCenter As Geometry.Point3d, ByVal dFactor As Double) '' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim nCurVport As Integer = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT")) '' Get the extents of the current space when no points '' or only a center point is provided '' Check to see if Model space is current If acCurDb.TileMode = True Then If pMin.Equals(New Geometry.Point3d) = True And _ pMax.Equals(New Geometry.Point3d) = True Then pMin = acCurDb.Extmin pMax = acCurDb.Extmax End If Else '' Check to see if Paper space is current If nCurVport = 1 Then If pMin.Equals(New Geometry.Point3d) = True And _ pMax.Equals(New Geometry.Point3d) = True Then pMin = acCurDb.Pextmin pMax = acCurDb.Pextmax End If Else '' Get the extents of Model space If pMin.Equals(New Geometry.Point3d) = True And _ pMax.Equals(New Geometry.Point3d) = True Then pMin = acCurDb.Extmin pMax = acCurDb.Extmax End If End If End If '' Start a transaction Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() '' Get the current view ' Using acview Using acView As ViewTableRecord = acDoc.Editor.GetCurrentView() Dim eExtents As Extents3d '' Translate WCS coordinates to DCS Dim matWCS2DCS As Geometry.Matrix3d matWCS2DCS = Geometry.Matrix3d.PlaneToWorld(acView.ViewDirection) matWCS2DCS = Geometry.Matrix3d.Displacement(acView.Target - Geometry.Point3d.Origin) * matWCS2DCS matWCS2DCS = Geometry.Matrix3d.Rotation(-acView.ViewTwist, _ acView.ViewDirection, _ acView.Target) * matWCS2DCS '' If a center point is specified, define the '' min and max point of the extents '' for Center and Scale modes If pCenter.DistanceTo(Geometry.Point3d.Origin) <> 0 Then pMin = New Geometry.Point3d(pCenter.X - (acView.Width / 2), _ pCenter.Y - (acView.Height / 2), 0) pMax = New Geometry.Point3d((acView.Width / 2) + pCenter.X, _ (acView.Height / 2) + pCenter.Y, 0) End If '' Create an extents object using a line Using acLine As Line = New Line(pMin, pMax) eExtents = New Extents3d(acLine.Bounds.Value.MinPoint, _ acLine.Bounds.Value.MaxPoint) End Using '' Calculate the ratio between the width and height of the current view Dim dViewRatio As Double dViewRatio = (acView.Width / acView.Height) '' Tranform the extents of the view matWCS2DCS = matWCS2DCS.Inverse() eExtents.TransformBy(matWCS2DCS) Dim dWidth As Double Dim dHeight As Double Dim pNewCentPt As Geometry.Point2d '' Check to see if a center point was provided (Center and Scale modes) If pCenter.DistanceTo(Geometry.Point3d.Origin) <> 0 Then dWidth = acView.Width dHeight = acView.Height If dFactor = 0 Then pCenter = pCenter.TransformBy(matWCS2DCS) End If pNewCentPt = New Geometry.Point2d(pCenter.X, pCenter.Y) Else '' Working in Window, Extents and Limits mode '' Calculate the new width and height of the current view dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y '' Get the center of the view pNewCentPt = New Geometry.Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5), _ ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5)) End If '' Check to see if the new width fits in current window If dWidth > (dHeight * dViewRatio) Then dHeight = dWidth / dViewRatio '' Resize and scale the view If dFactor <> 0 Then acView.Height = dHeight * dFactor acView.Width = dWidth * dFactor End If '' Set the center of the view acView.CenterPoint = pNewCentPt '' Set the current view acDoc.Editor.SetCurrentView(acView) End Using '' Commit the changes acTrans.Commit() End Using End Sub
mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|