Pages: 1
- Sujet précédent - Problème API .NET: Envoi de lignes de commandes à AutoCAD - Sujet suivant
#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
Pages: 1
- Sujet précédent - Problème API .NET: Envoi de lignes de commandes à AutoCAD - Sujet suivant