rohart Posté(e) le 26 mars 2012 Posté(e) le 26 mars 2012 (modifié) Bonjour, dans le code et plus particulièrement la ligne en grasTry 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é le 29 mars 2012 par (gile) formatage du code
(gile) Posté(e) le 29 mars 2012 Posté(e) le 29 mars 2012 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
rohart Posté(e) le 2 avril 2012 Auteur Posté(e) le 2 avril 2012 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
(gile) Posté(e) le 2 avril 2012 Posté(e) le 2 avril 2012 Citation 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.AcadDocumentsoit 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
rohart Posté(e) le 4 avril 2012 Auteur Posté(e) le 4 avril 2012 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
(gile) Posté(e) le 4 avril 2012 Posté(e) le 4 avril 2012 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 AcadDocumentEn 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
rohart Posté(e) le 6 avril 2012 Auteur Posté(e) le 6 avril 2012 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'.
(gile) Posté(e) le 6 avril 2012 Posté(e) le 6 avril 2012 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 dialogueIl 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
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