sam-123 Posté(e) le 28 février 2010 Posté(e) le 28 février 2010 Me revoilà,J’ai passé une nuit agité :mad: Je pensais que ça allais bien ce passer mais comme d’habitude le trou noir !Ma première ide étais de crée un Layout puis un View dan la même procédureL’ide était bonne mais ma manière n’étais pas la bonne. ;) Alors j’ai fait deux procédure, une pour le Layout l’autre pour la View. Procédure Layout : Elle fonction bien (je trouve) Procédure View : là ca cloche, elle crée effectivement une View mais elle ne l’insert pas dans le Layout crée précédemment.Pourtant je mets le Layout choisie sur Current ? Voila mes deux procédures Procédure Layout : Public Sub lesLayout() Dim MyDwg As Document = Application.DocumentManager.MdiActiveDocument Dim MyDb As Database = MyDwg.Database Using MyTrans As Transaction = MyDb.TransactionManager.StartTransaction() Dim LeBlockTable As BlockTable = MyTrans.GetObject(MyDb.BlockTableId, OpenMode.ForRead) Dim LeLayoutMan As LayoutManager = Autodesk.AutoCAD.DatabaseServices.LayoutManager.Current Dim LeLayout As Layout = Nothing Dim Trouve As Boolean = False Dim LesItems As SymbolTableEnumerator = LeBlockTable.GetEnumerator Do While LesItems.MoveNext Dim LeBlockTableRec As BlockTableRecord = LesItems.Current.GetObject(OpenMode.ForRead) If LeBlockTableRec.IsLayout Then LeLayout = MyTrans.GetObject(LeBlockTableRec.LayoutId, OpenMode.ForRead) If LeLayout.LayoutName = "Test1" Then Trouve = True Exit Do End If End If Loop If Trouve = False Then LeLayout = MyTrans.GetObject(LeLayoutMan.CreateLayout("Test1"), OpenMode.ForWrite) LeLayout.TabOrder = 0 End If MyDwg.Editor.Regen() MyTrans.Commit() End Using End Sub Procédure View : Public Sub LesView() Dim MyDwg As Document = Application.DocumentManager.MdiActiveDocument Dim MyDb As Database = MyDwg.Database Using MyTrans As Transaction = MyDb.TransactionManager.StartTransaction() Dim myLM As Autodesk.AutoCAD.DatabaseServices.LayoutManager myLM = Autodesk.AutoCAD.DatabaseServices.LayoutManager.Current Dim MyBlockTable As BlockTable = MyTrans.GetObject(MyDb.BlockTableId, OpenMode.ForRead) Dim MyBlockTableRec As BlockTableRecord = MyTrans.GetObject(MyBlockTable(BlockTableRecord.PaperSpace), OpenMode.ForWrite) myLM.CurrentLayout = "Test1" Dim MyView As Viewport = New Viewport() MyView.SetDatabaseDefaults() MyView.CenterPoint = New Point3d(0, 0, 0) MyView.Width = 200 MyView.Height = 100 MyBlockTableRec.AppendEntity(MyView) MyTrans.AddNewlyCreatedDBObject(MyView, True) MyDwg.Editor.Regen() MyTrans.Commit() End Using End Sub
(gile) Posté(e) le 28 février 2010 Posté(e) le 28 février 2010 Salut, Pour le Layout tu emploies une méthode bien compliquée pour évaluer s'il existe déjà.Regarde la méthode LayoutManager.GetLayoutId(String name). Pour le Viewport tu peux voir cet exemple.Chaque Layout est lié à un BlockTableRecord qui contient les objets graphiques de la présentation (comme avec COM (VBA) et le Block du Layout). C'est à ce BlockTableRecord qu'il faut ajouter le Viewport. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sam-123 Posté(e) le 1 mars 2010 Auteur Posté(e) le 1 mars 2010 Merci i gile ton exemple sur les views ma résolue mon problèmeMais pour le Layout ton indication est trop courte pour que je puisse par mon expérience (trop courte) pour pouvoir la résoudre seul. ;) Question : c’est passible de faire ces deux action en une seule procédure ?
(gile) Posté(e) le 1 mars 2010 Posté(e) le 1 mars 2010 Salut, private void CreateLayoutAndViewport(string name) { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { LayoutManager lm = LayoutManager.Current; ObjectId id = lm.GetLayoutId(name); if (id.OldId != 0) { Application.ShowAlertDialog("La présentation " + name + " existe déjà"); return; } Layout lay = (Layout)tr.GetObject(lm.CreateLayout(name), OpenMode.ForRead); lm.CurrentLayout = name; Point2d minPt = lay.PlotPaperMargins.MinPoint, maxPt = lay.PlotPaperMargins.MaxPoint, pSize = lay.PlotPaperSize; bool landscape = lay.PlotRotation == PlotRotation.Degrees000 || lay.PlotRotation == PlotRotation.Degrees180; double width = landscape ? pSize.X - maxPt.X - minPt.X : pSize.Y - maxPt.Y - minPt.Y; double height = landscape ? height = pSize.Y - maxPt.Y - minPt.Y : pSize.X - maxPt.X - minPt.X; if (width != 0.0 && height != 0.0) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(lay.BlockTableRecordId, OpenMode.ForWrite); Viewport vp = new Viewport(); vp.Width = width; vp.Height = height; vp.CenterPoint = new Point3d(width / 2.0, height / 2.0, 0.0); btr.AppendEntity(vp); tr.AddNewlyCreatedDBObject(vp, 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