Bonjour,

J'ai récupéré un bout de lisp sur le net et j'aimerais avoir une aide pour le comprendre et le modifier. je tiens à remercier son auteur pour l'aide précieuse apportée.

Étant novice sur Visual Lisp, je sollicite votre aide. je ne connais que Python, Matlab et Scilab.

Quel ligne de code donne le nombre de lignes et le nombres de colonnes du tableau ?

Est ce : pour les colonnes et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
setq NumRows (+ 3 LayerCount)
pour les lignes ?

Serait il possible de quantifier le nombre de lignes au résultats du filtre suivant au début de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
setq filteredLayers "*EP_PRO_TRANCHEE_*"
soit indiquée à LayerCount le nombre de fichiers trouvés

Est il possible avec ce filtre à l'inverse d'exclure des calques commencçant par EP_PRO_S.... ?

Comment peut on ajouter des colonnes ?

Merci d'avance pour l'aide.

Cordialement

Voici le code en entier

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
(vl-load-com)
 
(defun c:tableau_Perimetres (
 
 / acadObject column ColWidth endPt filteredLayers filteredObjets i LayerCount LayerName layerNames lcLayerName
 
   LineWeightMedium LineWeightNone LineWeightThick ModelSpace n NumColumns NumRows objectName perimeter Point3D_UCS
 
   Point3D_WCS Resultat Resultats row RowHeight tableau textsize ThisDrawing Total vlaLayers vlaPoint3D vlaTableau
 
   )
 
 
 
   ;; ======================================================================================================================
 
   ;; Personnalisation
 
   ;; ======================================================================================================================
 
 
 
   ;; Liste des calques et objets désirés, séparés par des virgules, sans espace, wildcard acceptés, en minuscules ou majuscules
 
   ;; Exemple pour calques: "*" pour tous les calques, "E*,Z*" pour tous ceux qui commencent par E et par Z
 
   ;; Exemple pour objets "*" pour tous les objets "*line,circle" pour tous les objets dont le nom se termine par "line", ainsi que les cercles
 
   (setq filteredLayers "*EP_PRO_TRANCHEE_*")  
 
   (setq filteredObjets "*line")  
 
 
   ;; Taille du tableau
 
   (setq textsize (getvar "textsize"))          ; Voir cette variable qui contrôle la hauteur du texte
 
   (setq RowHeight (* 2.0 textsize))
 
   (setq ColWidth (* 10.0 RowHeight))           ; Largeur totale du tableau = 2 * ColWidth puisqu'on a 2 colonnes
 
   (setq LineWeightThick acLnWt090)             ; Épaisseur de la ligne de séparation (voir LWDISPLAY)
 
   (setq LineWeightMedium acLnWt040)            ; Épaisseur de la ligne de séparation (voir LWDISPLAY)
 
   (setq LineWeightNone acLnWt000)              ; Épaisseur de la ligne de séparation (voir LWDISPLAY)
 
 
 
 
   ;; ======================================================================================================================
 
   ;; Ne pas modifier la suite du programme
 
   ;; ======================================================================================================================
 
 
   (setq filteredLayers (strcase filteredLayers t))  ; Minuscules
 
   (setq filteredObjets (strcase filteredObjets t))  ; Minuscules
 
 
 
   (setq acadObject (vlax-get-acad-object))
 
   (setq ThisDrawing (vla-get-ActiveDocument acadObject))
 
   (setq ModelSpace (vla-get-ModelSpace ThisDrawing))
 
   (setq vlaLayers (vla-get-Layers ThisDrawing))
 
   (setq LayerCount (vla-get-count vlaLayers))
 
 
   (setq Point3D_UCS (getpoint "\nPoint d'insertion: "))
 
   (setq Point3D_WCS (trans Point3D_UCS 1 0))  ; Si pas en WCS
 
   (setq vlaPoint3D (PointToVariant Point3D_WCS))
 
 
   ;; En AutoLISP, il n'y a pas de tableau. On va se créer un faux tableau avec des clés (hash table)
 
   ;; dont les paires sont (LayerName Count)
 
   (setq Resultats nil)
 
   (setq layerNames nil)
 
   (vlax-for vlaLayer vlaLayers
 
      (setq layerName (vla-get-name vlaLayer))
 
      (setq lcLayerName (strcase layerName t))  ; Minuscules
 
      (if (wcmatch lcLayerName filteredLayers) (setq layerNames (cons lcLayerName layerNames)))
 
   )
 
   (setq layerNames (vl-sort layerNames '<))  ; Trier en ordre croissant
 
   (setq Resultats (mapcar '(lambda (x) (cons x 0.0)) layerNames))
 
 
   (vlax-for vlaObject ModelSpace
 
 
 
      (if (and (wcmatch (setq objectName (strcase (vla-get-ObjectName vlaObject) t)) filteredObjets)
 
               (wcmatch (setq layerName (strcase (vla-get-Layer vlaObject) t)) filteredLayers)
 
          )
 
      (progn
 
         (setq endPt (vlax-curve-getEndParam vlaObject))
 
         (setq perimeter (vlax-curve-getDistAtParam vlaObject endPt))
 
         (setq Total (+ perimeter (cdr (assoc layerName Resultats))))
 
         (setq Resultats (subst (cons layerName Total) (assoc layerName Resultats) Resultats))
 
      ))
 
   )
 
 
   (setq NumRows (+ 3 LayerCount)) ; 2 lignes de titre + total
 
   (setq NumColumns 2)
 
   (setq vlaTableau (vla-AddTable ModelSpace vlaPoint3D NumRows NumColumns RowHeight ColWidth))
 
 
   ;; Ligne 0
 
   (setq row 0)
 
   (setq column 0)
 
   (SetCellProperties vlaTableau row column "Résultats" textsize acMiddleCenter nil)
 
 
   ;; Ligne 1, colonne 0
 
   (setq row 1)
 
   (setq column 0)
 
   (SetCellProperties vlaTableau row column "Calques" textsize acMiddleCenter (cons acHorzBottom LineWeightMedium))
 
 
   ;; Ligne 1, colonne 1
 
   (setq row 1)
 
   (setq column 1)
 
   (SetCellProperties vlaTableau row column "Longueur de tranchée" textsize acMiddleCenter (cons acHorzBottom LineWeightMedium))
 
 
   ;; Lignes de résultat
 
   (setq i 0)
 
   (setq n LayerCount)
 
   (setq Total 0.0)
 
   (while (< i n);remplacer 4 par n
 
      (setq Resultat (nth i Resultats))
 
      (setq row (+ i 2))
 
 
      ;; Calque
 
      (setq column 0)
 
      (setq layerName (strcase (car Resultat)))
 
      (SetCellProperties vlaTableau row column layerName textsize acMiddleLeft nil)
 
 
      ;; Longueur de tranchée
 
      (setq column 1)
 
      (setq perimeter (cdr Resultat))
 
      (setq Total (+ Total perimeter))
 
      (SetCellProperties vlaTableau row column (rtos perimeter) textsize acMiddleRight nil)
 
      (setq i (1+ i))
 
   )
 
)
 
 
 
 
(defun SetCellProperties (
 
   vlaTableau Row Column Texte TextHeight Alignment LineWeightPair
 
   )
 
   ;; Gère les propriétés populaires des cellules d'un tableau
 
   ;;    vlaTableau Row Column : Obligatoire, les autres sont facultatifs
 
   ;;    Row, Column : INT, base 0
 
   ;;    Alignment: INT,
 
   ;;    LineWeightPair: nil, sinon (cons "AcGridLineType enum" "acad_lweight enum"), soit (cons Position Épaisseur)
 
   ;; Support pour Acad2006 et Acad2009
 
   (if LineWeightPair (vla-SetCellGridLineWeight vlaTableau Row Column (car LineWeightPair) (cdr LineWeightPair)))
 
   (if Alignment (vla-SetCellAlignment vlaTableau Row Column Alignment))
 
   (if TextHeight (vla-SetCellTextHeight vlaTableau Row Column TextHeight))
 
   (if Texte
 
      (if vla-SetCellValue
 
         (vla-SetCellValue vlaTableau Row Column Texte) ; AutoCAD 2009
 
         (vla-SetText vlaTableau Row Column Texte)      ; AutoCAD 2006
 
      )
 
   )
 
)
 
 
;;; PointToVariant
 
;;; Conversion de Point2D ou Point3D en variant
 
(defun PointToVariant (
 
   point
 
 / arraySpace sArray
 
   )
 
   (setq arraySpace (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length point)))))
 
   (setq sArray (vlax-safearray-fill arraySpace point))
 
   (vlax-make-variant sArray)
 
)