Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Viewport

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:  Viewport (4015 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: 09. Jun. 2010 22:08    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 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 * 2

layoutblockdef.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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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: 10. Jun. 2010 07:59    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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: 10. Jun. 2010 09:31    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

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



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: 10. Jun. 2010 11:01    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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: 10. Jun. 2010 12:42    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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: 10. Jun. 2010 12:57    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

okay, danke für den Tipp!

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

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: 08. Feb. 2011 12:32    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 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 >>)

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