PhilBat Posté(e) le 21 février 2012 Posté(e) le 21 février 2012 Bonjour,au lancement de chaque dessin sous autocadj'utilise le fichier acaddoc.lsp pour lancerune routine dll créee sous visual basic 2008mais le problème c'est que je fais appel à des variables systèmes autocad (setsystemvariable) et je lance des instructions (sendcommand)dans autocad en vain car tant que le dessin n'est pas entièrementinitialisé je n'es accès à rien me semble t-il.j'aurai aimé trouver un fichier lisp qui se lance une foile dessin totalement initialisé et chargé. mercia+ Philippe
(gile) Posté(e) le 21 février 2012 Posté(e) le 21 février 2012 Salut, Je ne suis pas sûr que ton problème soit dû au fait que le dessin ne soit pas entièrement initialisé.Dans la mesure où tu charges la DLL avec la commande NETLOAD : (command "_netload" ...), tu utilises une commande AutoCAD qui n'est accessible que quand le dessin est entièrement initialisé. Ton problème vient peut-être de l'utilisation de la méthode COM SendCommand qui, comme son équivalent .NET SendStringToExecute, ne s'exécute pas toujours de manière synchrone. Tout ça n'est que suppositions. Si tu postais le code LISP du fichier acaddoc.lsp et le code .NET, on pourrait certainement plus facilement te renseigner. PS : pour initialiser des variables système des appels à la fonction LISP setvar dans ton acaddoc.lsp pourraient très bien fair l'affaire. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PhilBat Posté(e) le 23 février 2012 Auteur Posté(e) le 23 février 2012 mercipour votre réponse,il est fort possible que mon problème soit bien un défaut de syncronisationlors de l'utilisation de la commande "SendStringToExecute"comment y remédier ?SalutationsPhil
(gile) Posté(e) le 23 février 2012 Posté(e) le 23 février 2012 Salut, Le "plus propre" est d'éviter d'appeler les commandes natives en codant "en dur" ce que font ces commandes.Sinon, on peut invoquer la méthode ObjectARX non managée acedCommand qui, elle, est toujours synchrone. Je te propose ce bout de code inspiré par la classe CommandLine de Tony Tanzillo, où est défini une méthode Command() qui appelle acedCommand.Les arguments pour la méthode Command() sont ceux passés à la commande native appelée, exemple :Command("_zoom", "_extents")pour un zoom étendu. C# [system.Security.SuppressUnmanagedCodeSecurity] [DllImport("acad.exe", EntryPoint = "acedCmd", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] extern static private int acedCmd(IntPtr resbuf); /// <summary> /// Appelle une commande AutoCAD (toujours synchrone). /// </summary> /// <param name="args">Un ResultBuffer contenant le nom de la commande suivi des paramètres de la commande.</param> public static void Command(ResultBuffer args) { acedCmd(args.UnmanagedObject); } /// <summary> /// Appelle une commande AutoCAD (toujours synchrone). /// </summary> /// <param name="args">Le nom de la commande suivi des paramètres de la commande.</param> public static void Command(params object[] args) { ResultBuffer resbuf = new ResultBuffer(); foreach (object obj in args) { switch (obj.GetType().Name) { case "String": resbuf.Add(new TypedValue((int)LispDataType.Text, obj)); break; case "Int16": resbuf.Add(new TypedValue((int)LispDataType.Int16, obj)); break; case "Int32": resbuf.Add(new TypedValue((int)LispDataType.Int32, obj)); break; case "Double": resbuf.Add(new TypedValue((int)LispDataType.Double, obj)); break; case "Point2d": resbuf.Add(new TypedValue((int)LispDataType.Point2d, obj)); break; case "Point3d": resbuf.Add(new TypedValue((int)LispDataType.Point3d, obj)); break; case "ObjectId": resbuf.Add(new TypedValue((int)LispDataType.ObjectId, obj)); break; case "ObjectId[]": foreach (ObjectId id in (ObjectId[])obj) resbuf.Add(new TypedValue((int)LispDataType.ObjectId, id)); break; case "ObjectIdCollection": foreach (ObjectId id in (ObjectIdCollection)obj) resbuf.Add(new TypedValue((int)LispDataType.ObjectId, id)); break; case "SelectionSetDelayMarshalled": case "SelectionSetFullyMarshalled": resbuf.Add(new TypedValue((int)LispDataType.SelectionSet, obj)); break; default: throw new InvalidOperationException("Unsupported type in Command() method"); } } acedCmd(resbuf.UnmanagedObject); } VB<System.Security.SuppressUnmanagedCodeSecurity> _ <DllImport("acad.exe", EntryPoint := "acedCmd", CharSet := CharSet.Unicode, CallingConvention := CallingConvention.Cdecl)> _ Private Shared Function acedCmd(resbuf As IntPtr) As Integer End Function ''' <summary> ''' Appelle une commande AutoCAD (toujours synchrone). ''' </summary> ''' <param name="args">Un ResultBuffer contenant le nom de la commande suivi des paramètres de la commande.</param> Public Shared Sub Command(args As ResultBuffer) acedCmd(args.UnmanagedObject) End Sub ''' <summary> ''' Appelle une commande AutoCAD (toujours synchrone). ''' </summary> ''' <param name="args">Le nom de la commande suivi des paramètres de la commande.</param> Public Shared Sub Command(ParamArray args As Object()) Dim resbuf As New ResultBuffer() For Each obj As Object In args Select Case obj.[GetType]().Name Case "String" resbuf.Add(New TypedValue(CInt(LispDataType.Text), obj)) Exit Select Case "Int16" resbuf.Add(New TypedValue(CInt(LispDataType.Int16), obj)) Exit Select Case "Int32" resbuf.Add(New TypedValue(CInt(LispDataType.Int32), obj)) Exit Select Case "Double" resbuf.Add(New TypedValue(CInt(LispDataType.[Double]), obj)) Exit Select Case "Point2d" resbuf.Add(New TypedValue(CInt(LispDataType.Point2d), obj)) Exit Select Case "Point3d" resbuf.Add(New TypedValue(CInt(LispDataType.Point3d), obj)) Exit Select Case "ObjectId" resbuf.Add(New TypedValue(CInt(LispDataType.ObjectId), obj)) Exit Select Case "ObjectId[]" For Each id As ObjectId In DirectCast(obj, ObjectId()) resbuf.Add(New TypedValue(CInt(LispDataType.ObjectId), id)) Next Exit Select Case "ObjectIdCollection" For Each id As ObjectId In DirectCast(obj, ObjectIdCollection) resbuf.Add(New TypedValue(CInt(LispDataType.ObjectId), id)) Next Exit Select Case "SelectionSetDelayMarshalled", "SelectionSetFullyMarshalled" resbuf.Add(New TypedValue(CInt(LispDataType.SelectionSet), obj)) Exit Select Case Else Throw New InvalidOperationException("Unsupported type in Command() method") End Select Next acedCmd(resbuf.UnmanagedObject) End Sub 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