Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

au lancement de chaque dessin sous autocad

j'utilise le fichier acaddoc.lsp pour lancer

une routine dll créee sous visual basic 2008

mais 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èrement

initialisé je n'es accès à rien me semble t-il.

j'aurai aimé trouver un fichier lisp qui se lance une foi

le dessin totalement initialisé et chargé.

 

merci

a+ Philippe

Posté(e)

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

Posté(e)

merci

pour votre réponse,

il est fort possible que mon problème soit bien un défaut de syncronisation

lors de l'utilisation de la commande "SendStringToExecute"

comment y remédier ?

Salutations

Phil

Posté(e)

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

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é