banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Tue 16 March 2010 16:49

Ricainpowaaa
Juste Inscrit !
Date d'inscription: 16 Mar 2010
Messages: 2

Problème API .NET: Envoi de lignes de commandes à AutoCAD

Bonjour à tous,

Je suis actuellement en train de réaliser un programme sous AutoCAD Map en Vb.net.
La commande _adegenlink ne semblant pas être implémentée dans l'API, j'ai décidé de la lancer en ligne de commande. Après m'être frotté au SendStringToExecute qui n'est malheureusement pas synchrone, j'ai opté pour la solution AcedCmd.
Au premier abord c'est parfait, cela fonctionne.

Problème, je crée, avant de lancer cette commande, du code qui doit supprimer les données d'objets au cas où il en existe. Suite à celà, je lance ma commande _adegenlink avec tous les paramètres. Cette fois ci, les commandes ne fonctionnent plus.

Mon dessin affiché avec la requête ne contient qu'un texte et une polyligne. Le lien de données d'objets devrait donc se faire. Pourtant, la commande trouve 2 objets (elle ne devrait en trouver qu'un seul --> le texte), et quand j'essaye d'ajouter les éléments au SaveSet, cela ne fonctionne plus (il est à noter que j'ai rééssayé de lancer la sub qui ne s'occupe que des acedcmd et cela fonctionne normalement, a part l'ajout au saveset qui ne m'est proposé que dans ce cas...).

Voici mon code, ça sera peut être plus simple:

#Region "RcOD"

    <CommandMethod("RcOD")> _
    Sub MainRcOD()

        'Initialisation des variables
        intNbrActifNIV1 = 0
        intNbrActifNIV2 = 0
        intNbrActifNIV3 = 0

        'On redéfinit le fichier de niveau 3 actif (DessinAttachNIV3)
        Check_Case()

        'Lancement des query SQL
        Dim queryLib As Query.QueryLibrary = HostMapApplicationServices.Application.ActiveProject.QueryCategories
        Dim queryCat As Query.QueryCategory = queryLib("DECOUP")
        Dim querymod As QueryModel = HostMapApplicationServices.Application.ActiveProject.CurQuery
        i = 0

        'Passage de CMDDIA à 0
        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("CMDDIA", 0)

        'On boucle pour lancer toutes les requêtes
        For i = 0 To queryCat.QueryCount - 1

            querymod.Load(queryCat.Name, queryCat(i).Name)
            querymod.Mode = Constants.QueryType.QueryDraw
            querymod.Run()

            'On vérifie d'abord si la requete a extrait quelquechose
            'On lance la transaction
            Dim trans As Transaction = db.TransactionManager.StartTransaction()

            'Ouverture du BlockTable pour lecture
            Dim bt As BlockTable
            bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
            'Ouverture du block Table record pour lecture
            Dim btr As BlockTableRecord
            btr = bt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)

            Dim intNbrObj As Integer = 0
            For Each ObjId As ObjectId In btr
                intNbrObj = intNbrObj + 1
            Next

            'Si il y a des objets
            If intNbrObj <> 0 Then

                For Each objId As ObjectId In btr

                    Dim TableList As ObjectData.Tables = HostMapApplicationServices.Application.ActiveProject.ODTables
                    Dim ODTable As ObjectData.Table = TableList("REFPLANS")
                    Dim ODRecord As ObjectData.Records = ODTable.GetObjectTableRecords(0, objId, Constants.OpenMode.OpenForWrite, True)

                    'Si il y a des OD alors on les supprime, pour cette partie je ne suis pas du tout sûr, mais le problème ne vient pas de là
                    If ODRecord.Count <> 0 Then
                        j = 0
                        Dim ie As IEnumerator = ODRecord.GetEnumerator
                        For j = 0 To ODRecord.Count - 1
                            ie.MoveNext()
                            ODRecord.RemoveRecord()
                        Next
                        ODRecord.Dispose()

                    End If

                Next

                trans.Commit() 'Nécessaire?
                trans.Dispose() 'Nécessaire?

                'On appelle l'éxecution en AcedCmd
                RcAcedCmd()

                'On renvoie le SaveSet vers le dessin source si il contient qqch
                If DessinAttachNIV3.GetNumInSaveSet(Constants.SaveSetObjectTypes.QueriedExisted) <> 0 Then

                    SaveSet() 'Sous programme qui sauvegarde le SaveSet

                End If

            End If

        Next

        'On repasse la variable system à 1
        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("CMDDIA", 1)

    End Sub



    Sub RcAcedCmd()

        Dim tv As TypedValue
        Using resbuf As ResultBuffer = New ResultBuffer

            'On appelle toute la commande pour effectuer les liens de OD et mettre les éléments dans le SaveSet
            tv = New TypedValue(5005, "_zoom")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "_extents")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "_adegenlink")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "T")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "O")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "REFPLANS")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "O")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "S")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "F")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "1207000.0,2687000.0")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "0.0,1604000.0")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "_adeselobjs")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "S")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "TOUT")
            resbuf.Add(tv)
            tv = New TypedValue(5005, "")
            resbuf.Add(tv)

            acedCmd(resbuf.UnmanagedObject)

        End Using

    End Sub


D'où peut venir le problème ? J'espère que vous avez des idées, merci beaucoup.

Dernière modification par Ricainpowaaa (Wed 17 March 2010 09:04)

Hors ligne

 

#2 Wed 17 March 2010 14:15

fabcad
Participant assidu
Lieu: Acigné
Date d'inscription: 3 Apr 2006
Messages: 275

Re: Problème API .NET: Envoi de lignes de commandes à AutoCAD

Bonjour Ricainpowaaa,

Je ne peux pas t'aider en vb.net mais en Lisp, je pense qu'il faut filtrer les objets textes sur ta sélection.

A+

Hors ligne

 

Pied de page des forums

Powered by FluxBB