Aller au contenu

erreur avec autocad


Messages recommandés

Bonjour,

 

dans le code et plus particulièrement la ligne en gras

Try
           For i = 0 To acadDoc.ModelSpace.Count - 1
               Entity = acadDoc.ModelSpace.Item(i)
               If Entity.ObjectName = "AcDbBlockReference" Then
                   BlocRef = Entity
                   [b]If BlocRef.HasAttributes Then[/b]
                       Attributs = BlocRef.GetAttributes
                       CaracteristiquesBloc = "Bloc : " & BlocRef.Name
                       For j = LBound(Attributs) To UBound(Attributs)
                           CaracteristiquesBloc = CaracteristiquesBloc & Chr(13) & "Attribut : " & Attributs(j).TagString & " = " & Attributs(j).TextString
                           Attributs(j).TextString = ""
                       Next
                   End If
               End If
           Next

           acadDoc.Regen(AcRegenType.acAllViewports)
       Catch ex As Exception
           MessageBox.Show(Err.Number & " " & Err.Description)
           Dim monStreamWriter As StreamWriter = New StreamWriter("c:\temp\erreurToToCad.txt")

           
           monStreamWriter.WriteLine(Err.Number & " " & Err.Description)

           ''fermeture du fichier texte
           monStreamWriter.Close()
       End Try

 

nous avons une erreur -2147417851 The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))

 

et franchement ca me parles pas du tout

 

si quelqu'un a une idée d'où peut venir le problème et me donnez une voie de corection ce serait très gentil

Modifié par (gile)
formatage du code
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne vois pas d'erreur dans l'extrait de code que tu donnes, elle vient peut-être d'ailleurs (est elle capturée par ton Try/Catch ?)

 

Par contre comme tu utilises COM qui est dépendant de la version d'AutoCAD et de la plateforme (32 ou 64 bits) il faut bien référencer les bibliothèques Autodesk.AutoCAD.Interop et Autodesk.AutoCAD.Interop.Common correspondant à la version d'AutoCAD sur laquelle sera exécutée le code.

 

Pour palier à ça, il y a deux solutions.

La première, la plus simple : utiliser la liaison tardive qui permet de ne pas référencer de bibliothèque COM. Inconvénients : toutes les variables sont déclarées avec le type Object et on pert donc l'aide contextuelle de Visual Studio (intellisense). Les erreurs qui auraient pu être détectées à la compilation auront lieu à l'exécution d'où un débogage plus difficile. De plus, les performances peuvent s'en ressentir.

 

Exemple :

        <CommandMethod("test")> _
       Public Sub Test()
           Dim acadDoc As Object = Application.DocumentManager.MdiActiveDocument.AcadDocument
           Dim entity As Object
           Dim BlocRef As Object
           Dim Attributs As Object
           Dim CaracteristiquesBloc As String
           Try
               For i = 0 To acadDoc.ModelSpace.Count - 1
                   entity = acadDoc.ModelSpace.Item(i)
                   If entity.ObjectName = "AcDbBlockReference" Then
                       BlocRef = entity
                       If BlocRef.HasAttributes Then
                           Attributs = BlocRef.GetAttributes
                           CaracteristiquesBloc = "Bloc : " & BlocRef.Name
                           For j = LBound(Attributs) To UBound(Attributs)
                               CaracteristiquesBloc = CaracteristiquesBloc & Chr(13) & "Attribut : " & Attributs(j).TagString & " = " & Attributs(j).TextString
                               Attributs(j).TextString = ""
                           Next
                       End If
                   End If
               Next
               acadDoc.Regen(1)
           Catch ex As System.Exception
               Application.ShowAlertDialog(ex.Message + vbCr + ex.StackTrace)
           End Try
       End Sub

 

La seconde, plus difficile mais (bien) meilleure, utiliser .NET à la place COM. Pas de dépendances par rapport aux versions ou plateformes, plus grandes possibilités avec des bibliothèques (beaucoup) mieux fournies et rapidité d'exécution.

 

La même commande en VB.net (avec quelques commentaires) :

        <CommandMethod("test")> _
       Public Sub Test()
           Dim doc As Document = Application.DocumentManager.MdiActiveDocument ' document actif
           Dim db As Database = doc.Database ' base de données du document
           Dim CaracteristiquesBloc As String = ""
           ' démarrer une transaction pour ouvrir les objets AutoCAD
           Using tr As Transaction = db.TransactionManager.StartTransaction()
               Try
                   ' ouvrir l'espace courant en lecture
                   Dim space As BlockTableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead)
                   ' pour chaque identifiant d'objet dans l'espace courant
                   For Each id As ObjectId In space
                       ' on essaye de l'ouvrir en lecture comme BlockReference
                       Dim BlocRef As BlockReference = TryCast(tr.GetObject(id, OpenMode.ForRead), BlockReference)
                       ' si c'est bien une référence de bloc
                       If BlocRef IsNot Nothing Then
                           ' pour chaque attribut dans sa collection d'attributs
                           For Each attId As ObjectId In BlocRef.AttributeCollection
                               ' on ouvre l'attribut en écriture et on récupère son étiquette et sa valeur
                               Dim attRef As AttributeReference = tr.GetObject(attId, OpenMode.ForWrite)
                               CaracteristiquesBloc = CaracteristiquesBloc & Chr(13) & "Attribut : " & attRef.Tag & " = " & attRef.TextString
                               attRef.TextString = ""
                           Next
                       End If
                   Next
               Catch ex As Autodesk.AutoCAD.Runtime.Exception
                   Application.ShowAlertDialog(ex.Message + vbCr + ex.StackTrace)
               End Try
           End Using ' la transaction et tous les objets ouvert avec elle sont libérés
       End Sub

 

PS : je déplacerai ce message vers le forum ObjectARX/DBX, C++, .NET, RealDWG.

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

Lien vers le commentaire
Partager sur d’autres sites

oui l'erreur est capturée par mon try catch

 

j'ai essayé le premier code que vous m'avez donné mais il me surligne Application.DocumentManager me disant : 'DocumentManager' is not a member of 'System.Windows.Forms.Application'.

 

et également me surligne Application.ShowAlertDialog me disant : 'ShowAlertDialog' is not a member of 'System.Windows.Forms.Application'.

 

Je veux bien faire avec l'objet ARX mais je passe des paramètres à mon application donc j'aimerais savoir si c'est possible de passer des paramètres avec l'objet ARX ??? Voilà comment je fait actuellement

 

 Public Sub main()

       Dim commandline As String

       Dim Result


       'Recupere les parametres
       commandline = Command()

       Result = StrItemInArray(commandline, ",")

       Application.EnableVisualStyles()
       If commandline = "" Then
           Lancement_Couvercle_Manuel()
       Else
           Valeur_Excel = MyArray(0)
           Valeur_Couvercle = MyArray(1)
           L_Flan_Cone = MyArray(2)
           Lg_Flan_Cone = MyArray(3)
           Sous_Traitance = MyArray(4)
           Basetest = MyArray(5)
           sUser = MyArray(6)

           'rechercheSpirit()

           vUserForm_Appareil.Txtbox_Numero_Appareil.Text = Valeur_Excel
           vUserForm_Appareil.ShowDialog()
       End If


   End Sub

Lien vers le commentaire
Partager sur d’autres sites

j'ai essayé le premier code que vous m'avez donné mais il me surligne Application.DocumentManager me disant : 'DocumentManager' is not a member of 'System.Windows.Forms.Application'.

 

Je ne sais pas comment tu définis ton acadDoc dans l'extrait que tu as posté au début, mais en .NET on fait comme j'ai montré.

L'espace de nom Windows.Forms a une classe Application et l'espace de nom Autodesk.AutoCAD.ApplicationServices en a une aussi. Pour les distinguer, soit tu donnes le nom complet :

Dim acadDoc As Object = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.AcadDocument

soit tu définis un alias pour l'application AutoCAD dans tes instructions Imports :

Imports AcAp = Autodesk.AutoCAD.ApplicationServices.Application
...
Dim acadDoc As Object = AcAp.DocumentManager.MdiActiveDocument.AcadDocument

 

Pour ton autre question, je ne sais quoi répondre. L'extrait que donnes, est beaucoup trop partiel, variables et procédures inconnues...

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

Lien vers le commentaire
Partager sur d’autres sites

Tout d'abord merci

 

J'ai essayé ce que tu m'as dit

 

Dim acadDoc As Object = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.AcadDocument

 

mais il me surligne me disant 'ApplicationServices' is not a member of 'AutoCAD'.

 

aussi non avant ma variable acadoc était défini comme ceci : Dim acadDoc As AcadDocument

 

 

 

 

Pour mon autre question

 

Public Sub main()

       Dim commandline As String

       Dim Result


       'Recupere les parametres
       commandline = Command()

       Result = StrItemInArray(commandline, ",")

       Application.EnableVisualStyles()
       If commandline = "" Then
           Lancement_Couvercle_Manuel()
       Else
           Valeur_Excel = MyArray(0)
           Valeur_Couvercle = MyArray(1)
           L_Flan_Cone = MyArray(2)
           Lg_Flan_Cone = MyArray(3)
           Sous_Traitance = MyArray(4)
           Basetest = MyArray(5)
           sUser = MyArray(6)

           'rechercheSpirit()

           vUserForm_Appareil.Txtbox_Numero_Appareil.Text = Valeur_Excel
           vUserForm_Appareil.ShowDialog()
       End If


   End Sub

 

 Public Function StrItemInArray(ByVal Chaine As String, ByVal Separateur As String) As Object
       Dim NbSeparateur As Integer
       Dim Emplacement As Integer
       Dim SauvEmpl As Integer


       NbSeparateur = 1
       SauvEmpl = 1
       If Right(Chaine, 1) <> Separateur Then
           Chaine = Chaine + Separateur
       End If
       Do While InStr(Emplacement + 1, Chaine, Separateur, vbTextCompare)
           Emplacement = InStr(Emplacement + 1, Chaine, Separateur, vbTextCompare)
           ReDim Preserve MyArray(NbSeparateur - 1)
           MyArray(NbSeparateur - 1) = Mid(Chaine, SauvEmpl, Emplacement - SauvEmpl)
           SauvEmpl = Emplacement + 1
           NbSeparateur = NbSeparateur + 1
       Loop
       StrItemInArray = MyArray
   End Function

 

 Public Poids_Couvercle_A As Double
   Public TypePlate_A As Object
   Public D1_A As Double
   Public D2_A As Double
   Public D3_A As Double
   Public G_A As Double
   Public ConeThick_A As Object
   Public ThRenf_A As Double
   Public Th_cover_A As Object
   Public Renf_Type_A As Object
   Public HingeType_A As Object
   Public DN_A1 As Object
   Public ThCoverMachined_A As Object
   Public Matiere_A As String
   Public Valeur_Couvercle As String
   Public L_Flan_Cone As Object
   Public Lg_Flan_Cone As Object
   Dim Sous_Traitance As String
   Public Requisition As Object
   Public Identique As Boolean
   Public Cote_Charniere As Boolean

   Public Poids_Couvercle_B As Double
   Public TypePlate_B As Object
   Public D1_B As Double
   Public D2_B As Double
   Public D3_B As Double
   Public G_B As Double
   Public ConeThick_B As Object
   Public ThRenf_B As Double
   Public Th_cover_B As Object
   Public Renf_Type_B As Object
   Public HingeType_B As Object
   Public DN_B2 As Object
   Public ThCoverMachined_B As Object
   Public Matiere_B As String

   Public MCOrderNo As Object
   Public UnitName As String
   Public D_Cover As Object
   Public HingeType As Object
   Public Dim_C As Object
   Public Dim_D As Object
   Public Shell_Type As Object
   Public D_Ext As Object
   Public D_Circular As Object
   Public Cote As Object
   Public Cote_Cover As Object
   Public D2 As Double
   Public D3 As Double
   Public G As Double
   Public ConeThick As Object
   Public E_Renfort As Double
   Public D_Renfort As Double
   Public Dim_R As Double
   Public Dim_R1 As Double
   Public Dim_R1plus3 As Double
   Public Dim_R2 As Double
   Public Dim_A As Double
   Public Dim_Asur2 As Double
   Public Dim_A1 As Double
   Public Dim_A1sur2 As Double
   Public Ep_Plateau As Object
   Public Ep_Cone As Double
   Public Pv_Code As Double
   Public Th_Renf As Object
   Public ThCoverMachined As Object
   Public Poids_Couvercle As Double
   Public D_Couvercle As Object
   Public Matiere As String
   Public Th_cover_brut As Object

   Public CE As Double
   Public CI As Double
   Public Tet_A As Double
   Public Tet_A1 As Double
   Public Valeur_A As Double
   Public Valeur_A1 As Double
   Public Charnière As Boolean
   Public Pied As Boolean

   Public NumeroSHE As Object

   Public Login As String
   'Public oNet As New WshNetwork
   Public User As Object
   Public Nom As Object

   Public Valeur_Excel As String

   Public DN As Object
   Public Calque As AcadLayer
   Public BlocRef As AcadBlockReference
   Public Attributs As Object
   Public i, j As Integer
   Public Entity As AcadEntity
   Public CaracteristiquesBloc As String
   Public Reponse As Object
   Public Titre As Object
   Public VariableTempo As Object

   Public LastNumSHE As Object
   Public RequeteLastNumSHE As Object
   Public NumCommande As String
   Public OrdSql As String
   Public EnregRequeteLastNumSHE As Object
   Public RequeteAuto As Object

   Public vCote As String

   'variables autocad
   Public acadDoc As AcadDocument
   Public appAcad As AcadApplication

   'variable excel
   Public appExcel As Excel.Application 'Application Excel
   Public vClasseur As Excel.Workbook 'classeur excel

   Public Const pi = 3.14159265358979 ' valeur PI
   'Public CnAlfa As ADODB.Connection
   'Public RecSearch As New ADODB.Recordset
   Public Basetest As String
   Public valeur_arrondie As Integer
   Public sUser As String
   Public Country As String
   Public scnumcde As String
   Public Err_Temp As Boolean
   Public Num_serie
   'Global Stress_valeur As Double 
   Public MyArray() As String
   Public vUserForm_Couvcercle As New UserForm_Couvercle
   Public vUserForm_Appareil As New UserForm_Appareil
   Public vUserForm_Cote As New UserForm_Cote

 

Public Sub Lancement_Couvercle_Manuel()

       'Valeur_Excel = "30112-77001"
       Valeur_Couvercle = "AB"
       L_Flan_Cone = "930"
       Lg_Flan_Cone = "1845"
       Sous_Traitance = 1

       vUserForm_Appareil.Txtbox_Numero_Appareil.Text = "30112-77001"
       vUserForm_Appareil.Show()

   End Sub

Lien vers le commentaire
Partager sur d’autres sites

Dim acadDoc As Object = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.AcadDocument 

mais il me surligne me disant 'ApplicationServices' is not a member of 'AutoCAD'.

 

Il faut référencer les bibliothèques acdbmgd.dll et acmgd.dll (plus AcCoreMgd.dll pour 2013) que tu trouveras dans le répertoire d'installation d'AutoCAD ou, mieux, dans un répertoire inc d'ObjectARX20## si tu l'as installé.

 

aussi non avant ma variable acadoc était défini comme ceci : Dim acadDoc As AcadDocument

En faisant ça, tu déclares la variable acadDoc, mais tu ne l'initialises pas. Il faut que tu affectes un document à la variable. L'expression que j'ai donnée lui affecte le document courant (comme ThisDrawing).

 

D'une manière générale, si tu veux te lancer dans .NET, il va falloir beaucoup plus de rigueur et perdre les (mauvaises) habitudes prises en VBA.

.NET privilégie la Programmation Orientée Objet et s'appuie donc plus facilement sur un typage fort, il vaut mieux donc éviter d'utiliser le type Object (équivalent des Variants) pour typer les objets suivant leur type réel.

VB.net permet d'être moins rigoureux suivant les options de compilation choisies et peut donc en arriver à ressembler au VB(A), mais je pense que ce n'est pas une bonne habitude et qu'il vaut mieux utiliser l'option Strict = On. Ainsi Visual Studio pourra t'aider dès l'écriture du code et beaucoup d’erreurs seront signalés dès la compilation au lieu de ne se déclarer qu'à l'exécution (ou encore mieux, oublie VB et passe à C# comme ça tu seras moins tenté de faire du VBA en .NET).

 

PS : la classe .NET System.String a une méthode Split() qui fait exactement ce que fait la Sub StrItemInArray et retourne un tableau de chaînes (pas un Object !).

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

Lien vers le commentaire
Partager sur d’autres sites

J'ai référencé les bibliothèques acdbmgd.dll et acmgd.dll de l'object ARX 2009.

 

au départ sur cette ligne

 

Dim acadDoc As Object = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.AcadDocument()

 

je n'ai pas d'erreur

 

quand j'exécute le programme, VS me renvoit l'erreur suivante

 

'ApplicationServices' is not a member of 'AutoCAD'.

Lien vers le commentaire
Partager sur d’autres sites

As tu bien mis la propriété des DLLs acdbmgd et acmgd Copie Locale sur False ?

 

Ton projet cible-t-il bien la bonne version du Framework .NET (2.0 à partir de 2007, 3.5 à partir de 2010, 4.0 à partir de 2012) ?

 

Je crains de ne pas pouvoir beaucoup plus t'aider. Il semble qu'il te manque les bases élémentaires en .NET (et à fortiori en programmation d'AutoCAD avec .NET).

 

.NET, malgré les ressemblances syntaxiques entre VB.net et VBA, est un environnement de programmation fondamentalement différent du VBA (ou du VB6), plus puissant, mais aussi plus exigeant.

Avant de s'attaquer à la programmation d'AutoCAD avec .NET, il est essentiel de se familiariser avec cet environnement, Visual Studio et la POO en faisant quelques tutoriels (le Coach MSDN, par exemple).

Et seulement après, de s'essayer à la programmation d'AutoCAD, toujours avec des tutoriaux, les "officiels" (en anglais) :

- AutoCAD.Net Training.zip sur cette page

- My First AutoCAD Plug-in)

ou ceux que j'ai essayé de faire (à faire dans cet ordre) :

- Créer un modèle AutoCAD pour Visual Studio 2010

- Premier pas

- Tutoriel Boite de dialogue

Il est aussi indispensable d'essayer d'oublier le VBA (et les mauvaises habitudes qu'il favorise), c'est pourquoi je conseillerais plutôt d'apprendre C# au lieu de VB (C# n'est pas plus difficile que VB, juste plus rigoureux), la différence de syntaxe avec VB est vraiment minime au vu de la différence entre VBA et VB.net.

 

Voir ce sujet.

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

Lien vers le commentaire
Partager sur d’autres sites

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é