Aller au contenu

Messages recommandés

Posté(e)

En VB.NET sur AutoCAD, je fais une fonction qui fait un ZoomExtends, mais dans une database seulement, pas de document ouvert. (voir code plus bas). Seulement, je ne trouve pas comment le faire dans un "layout" ou en mode papier. Ça fonctionne très bien en "modelspace". Quelqu'un a déjà essayé ? ou des idées pour m'aider ?

 

Sub ZoomExtents(ByVal myDB As Autodesk.AutoCAD.DatabaseServices.Database)

Dim tm As Autodesk.AutoCAD.DatabaseServices.Transaction = myDB.TransactionManager.StartTransaction

Try

If myDB.TileMode = True Then 'Model

Dim vpt As ViewportTable = tm.GetObject(myDB.ViewportTableId, OpenMode.ForRead)

Dim vptr As ViewportTableRecord = tm.GetObject(vpt.Item("*Active"), OpenMode.ForWrite)

Dim pt3Max As Point3d = myDB.Extmax

Dim pt3Min As Point3d = myDB.Extmin

Dim pt2Max As Autodesk.AutoCAD.Geometry.Point2d = New Autodesk.AutoCAD.Geometry.Point2d(pt3Max.X, pt3Max.Y)

Dim pt2Min As Autodesk.AutoCAD.Geometry.Point2d = New Autodesk.AutoCAD.Geometry.Point2d(pt3Min.X, pt3Min.Y)

vptr.CenterPoint = (pt2Min + (pt2Max - pt2Min) / 2.0)

vptr.Height = (pt2Max.Y - pt2Min.Y)

vptr.Width = (pt2Max.X - pt2Min.X)

myDB.UpdateExt(True)

Else 'Papier

 

End If

Catch ex As Exception

MsgBox("Erreur de zoom, " & ex.Message)

Finally

tm.Commit()

tm.Dispose()

End Try

End Sub

Posté(e)

Salut,

 

D'après ce que je comprends en lisant ton code, tu n'agis que sur la fenêtre (Viewport) active.

Si tu veux agir sur tous les Layouts il faudrait faire un foreach sur la collection (LayoutDictionaryId).

Chaque Layout est constitué d'une configuration de traçage et d'un bloc (BlockTableRecord) qui contient les entités graphiques et les viewports

 

En C# (pas testé):

DBDictionary layoutDict = (DBDictionary)tm.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
       foreach (DBDictionaryEntry entry in layoutDict)
       {
           Layout lay = (Layout)tm.GetObject(entry.Value, OpenMode.ForRead);
           ViewportTableRecord vptr = (ViewportTableRecord)tm.GetObject(lay.GetViewports[0], OpenMode.ForWrite);
           ...
           ...
       }

 

En VB.net (je ne suis pas sûr de savoir en faire une traduction correcte)

Dim layoutDict as DBDictionary = tm.GetObject(db.LayoutDictionaryId, OpenMode.ForRead)
For Each entry as DBDictionaryEntry in layoutDict 
Dim lay as Layout = tm.GetObject(entry.Value, OpenMode.ForRead)
Dim vptr as ViewportTableRecord = tm.GetObject(lay.GetViewports(0), OpenMode.ForWrite)
...
...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci Gile, c'est pas exactement ce que je veux faire, mais je ne peux pas cracher sur ton idée. Je souhaite faire un zoom sur la vue active telle que tu l'as remarqué, mais je m'en préocuperai plus tard. Lorsque le dessin est sauvegardé dans un "layout", je suis incapable de changer le zoom.

 

J'ai essayé ton code et j'ai l'erreur suivante : Unable to cast object of type 'Autodesk.AutoCAD.DatabaseServices.Viewport' to type 'Autodesk.AutoCAD.DatabaseServices.ViewportTableRecord'.

 

J'ai essayé un milion de trucs et je crois avoir déjà vu ce message d'erreur. vptr est un ViewPortTableRecord et je lui en passe un qu'il n'aime pas trop !!? C'est sur cette ligne :

 Dim vptr As ViewportTableRecord = tm.GetObject(lay.GetViewports(0), OpenMode.ForWrite)

 

À partir d'ici, je recherche sur ce que tu m'as donné. On ne doit pas être bien loin d'une solution. Si tu as une idée de ce qui ne va pas, n'hésite pas. Je post aussi je trouve la solution.

 

 

Posté(e)

Salut,

 

Le message que tu as eu veut dire qu'une conversion est impossible entre les types Viewport et ViewportTableRecord.

 

J'ai essayé de faire quelque chose, les points (min et max) sont justes, mais chez moi, le zoom ne change pas (ni en EO ni en EP).

Si ça fonctionnait en EO chez toi, ça marchera peut-être en EP aussi...

 

Je te donne le code (C#) et te laisse le soin d'en faire la traduction...

 

private static void ZoomExtents(Database db)
{
     using (Transaction tr = db.TransactionManager.StartTransaction())
     {
         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
         Layout lay = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);
         if (lay.LayoutName == "Model")
         {
             ViewportTable vpt = (ViewportTable)tr.GetObject(db.ViewportTableId, OpenMode.ForRead);
             ViewportTableRecord vptr = (ViewportTableRecord)tr.GetObject(vpt["*Active"], OpenMode.ForWrite);
             Point3d min = db.Extmin;
             Point3d max = db.Extmax;
             vptr.CenterPoint = new Point2d((min.X + max.X) / 2.0, (min.Y + max.Y) / 2.0);
             vptr.Height = max.Y - min.Y;
             vptr.Width = max.X - min.X;
             db.UpdateExt(true);
         }
         else
         {
             ObjectIdCollection vports = lay.GetViewports();
             Viewport vp = (Viewport)tr.GetObject(vports[0], OpenMode.ForWrite);
             Point3d min = db.Pextmin;
             Point3d max = db.Pextmax;
             vp.CenterPoint = (min + max.GetAsVector()) / 2.0;
             vp.Height = max.Y - min.Y;
             vp.Width = max.X - min.X;
             db.UpdateExt(true);
         }
         tr.Commit();
     }
}

 

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité