Aller au contenu

Messages recommandés

Posté(e) (modifié)

Bonjour à tous,

 

J'essaie de créer ma propre extension (.dll) sur Autocad en utilisant C# WPF. Pour l'instant je fais des tests assez basiques en insérant une palette WPF sur Autocad et j'essaie de créer des lignes automatiquement à partir du C# mais lors de la "création" de ligne, Autocad me met une erreur fatale..

 

"ERREUR FATALE: Unhandled e0434352h Exception at d23aa388h"

 

Sur internet, j'ai aperçu que ça pouvait venir de ma carte graphique (Nvidia GeForce GTX 1060) et que le pilote ne soit pas à jour mais elle est bien à jour et sur le site d'Autocad elle n'est pas répertoriée..

 

Command.cs :

using System.Windows.Forms;
using System.Windows.Forms.Integration;
using Autodesk.AutoCAD.Windows;
using Autodesk.AutoCAD.Runtime;

namespace ClassLibrary1
{
   public class Commands
   {
       static PaletteSet _ps = null;

       [CommandMethod("wpf")]
       public void ShowWPFPalette()
       {
           if (_ps == null)
           {
               // Create the palette set
               _ps = new PaletteSet("WPF Palette");
               _ps.Size = new System.Drawing.Size(400, 600);
               _ps.DockEnabled = (DockSides)((int)DockSides.Left + (int)DockSides.Right);
               
               // Create our user control instance and host it in an ElementHost, which allows interop between WinForms and WPF
               
               UserControl1 uc = new UserControl1();
               ElementHost host = new ElementHost();
               host.AutoSize = true;
               host.Dock = DockStyle.Fill;
               host.Child = uc;
               _ps.Add("Add ElementHost", host);
           }

           // Display our palette set
           _ps.KeepFocus = true;
           _ps.Visible = true;
       }
   }
}

 

UserControl1.xaml.cs:

using System.Windows;
using System.Windows.Controls;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

using Application = Autodesk.AutoCAD.ApplicationServices.Application;

namespace ClassLibrary1
{
   /// <summary>
   /// Logique d'interaction pour UserControl1.xaml
   /// </summary>
   public partial class UserControl1 : UserControl
   {
       public UserControl1()
       {
           InitializeComponent();
       }

       public void ClickOK(object sender, RoutedEventArgs e)
       {
           string __S_NomProjet = _TB_NomProjet.Text;
           MessageBox.Show("Nom du projet : " + __S_NomProjet, "Nom Projet", MessageBoxButton.YesNo);
       }

       private void _B_BoutonCartouche_Click(object sender, RoutedEventArgs e)
       {
           // Get the current document and database
           Document acDoc = Application.DocumentManager.MdiActiveDocument;
           Database acCurDb = acDoc.Database;

           // Start a transaction
           using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
           {
               // Open the Block table for read
               BlockTable acBlkTbl;
               acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                               OpenMode.ForRead) as BlockTable;

               // Open the Block table record Model space for write
               BlockTableRecord acBlkTblRec;
               acBlkTblRec = acTrans.GetObject(acBlkTbl[blockTableRecord.ModelSpace],
                                               OpenMode.ForWrite) as BlockTableRecord;

               // Create a line that starts at 5,5 and ends at 12,3
               using (Line acLine = new Line(new Point3d(5, 5, 0),
                                             new Point3d(12, 3, 0)))
               {

                   // Add the new object to the block table record and the transaction
                   acBlkTblRec.AppendEntity(acLine);
                   acTrans.AddNewlyCreatedDBObject(acLine, true);
               }

               // Save the new object to the database
               acTrans.Commit();
           }
       }
   }
}

Merci ! :rolleyes:

Modifié par (gile)
Ajout des bbcodes
Posté(e)

Salut et bienvenue,

 

Quand on veut agir sur un document AutoCAD depuis une interface non modale il faut impérativement verrouiller ce document.

On peut le faire avec la méthode Document.LockDocument() dans une instruction using pour s'assurer que le document sera automatiquement déverrouillé.

using (acdoc.LockDocument())
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
   // ...
}

 

Mais il est préférable de définir la tache à accomplir dans une commande personnalisée (CommandMethod) et d'appeler cette commande avec SendStringToExecute() de façon à laisser le soin à AutoCAD de s'occuper du verrouillage / déverrouillage du document.

Ceci permet permet aussi de mieux séparer ce qui concerne l'interface de ce qui concerne le "métier" (AutoCAD) pratique généralement privilégiée avec WPF.

 

Tu peux voir ce tutoriel à propos des interfaces utilisateur avec AutoCAD .NET.

 

 

PS. quand tu postes du code utilise les bbcodes (le bouton : ).

  • Upvote 1

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é