cblais Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 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 TryEnd Sub
(gile) Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 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
cblais Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 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.
(gile) Posté(e) le 18 juillet 2009 Posté(e) le 18 juillet 2009 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant