Le Coin des AutoCADiens
Le site français des développeurs pour AutoCAD
Vous pourrez ici apprendre à programmer en Visual Basic pour AutoCAD.
 |
Recherches
|
|
|
Les Fonctions
|
Il y a les fonctions internes de VBA (telles que Abs ou Instr ) mais
il peut y avoir aussi les fonctions définies par l'utilisateur. Elles renvoient dans
leur nom un résultat qui sera utilisé dans l'application.
On crée les fonctions dans le module de feuille ou de code. On peut les définir publique
ou privée par Public ou Private.
Voici 3 fonctions qui pourront vous être utiles pour le développement en VBA.
Très différentes l'une de l'autre, toutes les trois concernent la recherche de fichiers ou de
répertoire.
Chacune est suivie d'un exemple d'utilisation.
|
Au menu :
- FindFile : L'équivalent de la commande AutoLISP de même nom.
- FouilleTout : Recherche d'un fichier sur tous les disques accessibles à l'aide de fonctions API.
- ChercheChemin : Recherche d'un répertoire sur tous les disques accessibles à l'aide de fonctions API.
|
FindFile
|
Cette fonction, analogue à la fonction FindFile d'AutoLISP, recherche le fichier spécifié
dans tous les répertoires accessibles par AutoCAD (répertoire du dessin courant, répertoire
d'Acad.exe, répertoires de fichiers de support, etc). Si le fichier est trouvé, la macro retournera le
chemin complet suivi du fichier, sinon elle retournera une chaîne vide.
Si le chemin spécifié comprend au moins un antislash (\), il est présumé que c'est un
un chemin complet et la macro vérifiera seulement que le fichier existe dans ce chemin.
Les caractères génériques (*, ?) ne fonctionnent pas correctement.
Rendons à César ... C'est une adaptation française du programme de Colin French.
|
La fonction FindFile |
Public Function FindFile(FileName As String) As String
Dim Path As String ' le chemin à trouver
Dim SupportPath As String ' copie des chemins Support d'Acad
Dim Pos As Integer ' position du séparateur dans SupportPath
'----On présume que c'est un chemin complet si le nom fourni contient '\' ------------------------
If InStr(1, FileName, "\") > 0 Then ' recherche d'un antislash
FindFile = FileName ' alors copie le chemin+nom comme résultat
On Error Resume Next ' en cas d'erreur disque
If Dir$(FileName) = "" Then FindFile = "" ' s'il n'existe pas, change le resultat en ""
If Err Then FindFile = "" ' si erreur, résultat ""
Exit Function ' retourne le résultat à la routine appelante
End If
'---- Recherche dans le répertoire courant ----------------------------------------------------------------
FindFile = CurDir$ & "\" & FileName ' construction chemin+fichier à tester
If Dir$(FindFile) <> "" Then Exit Function ' s'il existe, retourne comme resultat
'----Recherche dans le répertoire du dessin ---------------------------------------------------------------
Path = ThisDrawing.FullName ' Nom complet du dessin en cours
If Path <> "" Then ' Pour être sûr que ce n'est pas un dessin sans nom
Path = Left$(Path, Len(Path) - Len(ThisDrawing.Name)) ' on retire le nom à la fin du chemin
FindFile = Path & FileName ' construction chemin + nom du fichier
If Dir$(FindFile) <> "" Then Exit Function ' s'il existe, retourne comme resultat
End If
'----Recherche dans les répertoires de fichiers de Support ------------------------------------------------
SupportPath = ThisDrawing.Application.Preferences.SupportPath ' copie des chemins support
If Right$(SupportPath, 1) <> "\" Then SupportPath = SupportPath & "\" ' vérifie si '\' à la fin
Do While Len(SupportPath) > 0 ' teste chaque répertoire de Support
Pos = InStr(1, SupportPath, ";") ' cherche les séparateurs de répertoires
If Pos > 0 Then ' si un caractère séparateur trouvé...
Path = Left$(SupportPath, Pos - 1) '...extrait le chemin devant ce séparateur
Else ' sinon, plus de séparateur...
Path = SupportPath '...c'est le dernier chemin de SupportPath
End If
If Right$(Path, 1) <> "\" Then Path = Path & "\" ' vérifie si '\' à la fin
FindFile = Path & FileName ' construction chemin + nom du fichier à tester
If Dir$(FindFile) <> "" Then Exit Function ' s'il existe, retourne comme résultat
SupportPath = Right$(SupportPath, Len(SupportPath) - Len(Path)) ' supprime le chemin venant d'être testé
If Left$(SupportPath, 1) = ";" Then ' s'il y a un séparateur,
SupportPath = Right$(SupportPath, Len(SupportPath) - 1) ' le supprimer également
End If
Loop ' teste le chemin suivant dans SupportPath
'----Recherche dans le répertoire Programme d'AutoCAD -----------------------------------------------------
Path = ThisDrawing.Application.Path ' chemin de ACAD.EXE
If Right$(Path, 1) <> "\" Then Path = Path & "\" ' vérifie si '\' à la fin
FindFile = Path & FileName ' construction chemin + nom du fichier à tester
If Dir$(FindFile) <> "" Then Exit Function ' s'il existe, retourne comme résultat
'----Fichier non trouvé, une chaîne vide est retournée ----------------------------------------------------
FindFile = ""
End Function
|
Routine de test de la fonction |
Cette routine n'a pour seul but que de tester la fonction FindFile. Elle affiche une IputBox
pour entrer le nom du fichier à rechercher, appelle la fonction, puis affiche le résultat.
|
Public Sub TestFindFile()
Dim res As String ' Le résultat de la fonction
Dim msg As String ' messages à l'utilisateur
'----Demande à l'utilisateur le nom du fichier----------------------------------------------------------------
msg = "Entrez le nom du fichier que vous désirez tester avec la fonction FindFile." & vbCrLf & vbCrLf
msg = msg & "FindFile va regarder dans le répertoire courant," & vbCrLf
msg = msg & "le répertoire contenant le dessin en cours (s'il y en a un)," & vbCrLf
msg = msg & "les répertoires des fichiers de Support d'AutoCAD, " & vbCrLf
msg = msg & "et le répertoire des fichiers Programmes d'AutoCAD." & vbCrLf
res = InputBox(msg, "Test de FindFile", "acad14.cfg")
'----Retrouver le chemin complet avec FindFile----------------------------------------------------------------
If res <> "" Then ' si l'utilisateur clique sur 'Annuler', res = ""
res = FindFile(res) ' recherche le fichier
If res = "" Then ' FindFile retourne "" si fichier non trouvé
msg = "Ce fichier ne peut être trouvé." ' compose le message
MsgBox msg, vbInformation, "Test de FindFile" ' et prévient l'utilisateur
Else
msg = "Fichier trouvé dans : '" & res & "'." ' FindFile retourne le chemin complet + nom du fichier
MsgBox msg, vbInformation, "Test de FindFile" ' Donne le résultat à l'utilisateur
End If
End If
End Sub
|
La routine FindFile ci-dessus vous est fournie avec ce fichier.
|
FouilleTout
|
Contrairement à la macro précédente, la fonction FouilleTout recherche le fichier spécifié
dans tous les répertoires de tous les disques, même les disques accessibles en réseau.
S"il y a plusieurs occurences du fichier, seul, le premier fichier trouvé sera retourné,
avec son chemin complet.
Les caractères génériques (*, ?) ne sont pas acceptés.
La fonction FindFile utilise la fonction Basic Dir, mais pour améliorer le traitement de recherche,
FouilleTout utilise les fonctions d'API de Windows beaucoup plus rapides.
|
La fonction FouilleTout |
Vous trouverez le code ci-joint. Il est entièrement documenté comme pour les autres exemples.
|
La macro comprend les éléments suivant :
- La fonction ListeDisques() : Une petite fonction qui vous donne la liste des disques logiques.
- La fonction FouilleDisque(Disque, Fichier) : Fonction principale de recherche d'un fichier sur un disque.
- La fonction FouilleTout(Fichier) : Fonction qui lance FouilleDisque sur chacun des disques donnés
par la fonction ListeDisques.
- La macro TestFouilleTout(): Le programme avec la petite feuille pour tester
les fonctions ci-dessus.
|
ChercheChemin
|

La fonction affiche la fenêtre Parcourir à la recherche d'un fichier qui
montre l'arborescence du système tout comme la boîte de Common Dialog . Par
contre ici , les fichiers ne sont pas affichés.
La macro retourne le chemin complet du répertoire sélectionné.
Tout comme la fonction précédente, ChercheChemin utilise des fonctions API.
|
La fonction ChercheChemin |
A placer dans Module1 :
- Les déclarations des 3 fonctions API nécessaires.
- La déclaration de type personnalisé BrowseInfo qui sert
à la fonction API qui affichera le navigateur.
- La fonction ChercheChemin elle-même.
|
' Déclarations des fonctions API
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
(ByVal pidList As Long, ByVal ByVallpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" _
(ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Function ChercheChemin() As String
'demande un chemin à l'utilisateur
Dim lpIDList As Long
Dim sBuffer As String
Dim strTitre As String
Dim tBrowseInfo As BrowseInfo
Dim retval
MAX_PATH = 255
On Error GoTo Erreur
' Titre de la boîte
strTitre = "Sélectionnez le répertoire" & Chr$(13) & _
"Les sous-répertoires sont également acceptés."
With tBrowseInfo
.lpszTitle = lstrcat(strTitre, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With
' affiche le navigateur
lpIDList = SHBrowseForFolder(tBrowseInfo)
' teste la valeur de retour
If (lpIDList) Then
sBuffer = Space(MAX_PATH)
' transforme la valeur de retour qui est un Long
retval = SHGetPathFromIDList(lpIDList, sBuffer)
' retire le caractère nul et ce qui vient après
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
ChercheChemin$ = sBuffer
' ajoute l'anti-slash (\) si nécessaire
If Not Right$(ChercheChemin$, 1) = "\" Then
ChercheChemin$ = ChercheChemin$ & "\"
End If
Else
ChercheChemin$ = ""
End If
Exit Function
Erreur:
ChercheChemin$ = ""
End Function
|
La routine de test de ChercheChemin |
La routine de test est toute simple et n'offre aucune particularité.
Vous la trouverez dans le projet complet comprenant cette routine ainsi que la fonction ChercheChemin
telle que ci-dessus.

|
|
Vous pouvez cliquer sur l'icône pour télécharger
le projet complet en VBA comprenant toutes les routines ci-dessus (56 ko)..
|

AcadUnsupp & Acvbext : Des Extensions pour AutoCAD ActiveX Automation

© 1998-2007 FASOFT - Roger Rosec Tous droits réservés.
|