Aller au contenu

Syntaxe de liste


Messages recommandés

Bonjour,

S'il y avait une rubrique qui précède "Débuter en LISP", elle me serait sans doute plus adaptée ! Mais je pose quand même ma question.

J'ai repris un LISP qui a été développé par une société qui commercialise Archibus, dont ce LISP contient donc des commandes.

En isolant une séquence de ce LISP principal (il est TRÈS long), j'ai pu en faire un tout petit, qui se contente de hachurer des locaux en fonction de leur typologie (c'est une fonction Archibus). Mais j'ai souhaité limiter cette comande de hachures à un seul type de locaux.

Ça donne ceci, et le LISP fonctionne :

(defun c:USAGES ()
 
   (afm_highlight_init)
   (AfmHighltQueryClear 0 "AR_USAGE-TEST")
   (AfmHighltQuerySetOwner "rmtype")
   (AfmHighltQuerySetAssigned "rm")
   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE")))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
   (afm_highlight_done)
   
   (princ)
 
 )

Le résultat donne un plan dont seuls les locaux de type "SINGLE OFFICE" sont hachurés.

Par contre, si je souhaite hachurer plusieurs types de locaux, seul le premier type de la liste est hachuré. Et je n'ai aucun message d'erreur.

Le LISP modifié est comme ceci :(defun c:USAGES ()
 
   (afm_highlight_init)
   (AfmHighltQueryClear 0 "AR_USAGE-TEST")
   (AfmHighltQuerySetOwner "rmtype")
   (AfmHighltQuerySetAssigned "rm")
   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" (list "MEETING ROOM" "SINGLE OFFICE"))))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
   (afm_highlight_done)
   
   (princ)
 
 )

Ici donc, seules les MEETING ROOM sont hachurées, et inversement si je liste d'abord les SINGLE OFFICE.

Même sans connaître ce programme Archibus, quelqu'un voit-il une autre façon d'adapter le premier LISP ?

Lien à poster
Partager sur d’autres sites

Bonjour,

Sans du tout connaître ArchiBus, en voyant le nom des fonctions (AfmHighltQuery....), cela me fait penser à des fonctions de requêtes (comme AutocadMap)

Il faudrait connaître la syntaxe exacte pour les appels faites par ces fonctions (Tu n'as pas de doc?)

Je pense qu'il faudrait employer simplement un "OR" dans l'appel mais je ne peut te proposer une syntaxe à employer.

Est ce que ArchiBus te permet de monter des requêtes manuellement? Çà pourrait aider  pour savoir la syntaxe à utiliser...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien à poster
Partager sur d’autres sites

Bonjour,

En fait, la société qui commercialise Archibus développe en même temps ce programme pour l'adapter à chaque client.

Il y a évidemment des standards et, en cherchant un peu, on peut trouver de la doc.

Ici, par exemple, ça renvoie vers cette commande de filtre (en anglais) mais ne m'indique pas la syntaxe exacte recherchée.

https://www.archibus.net/ai/abizfiles/v20.2_help/system_management_help/afm-sysman.htm

J'ai bien testé en ajoutant "OR" mais soit ce n'est pas accepté par Archibus, soit je me plante dans la syntaxe :

comme ceci,  (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" (list or "MEETING ROOM" "SINGLE OFFICE")))), j'obtiens un message d'erreur "; error: invalid data type or data overflow: #<SUBR @0000022995d6d598 OR>"

 

 

Lien à poster
Partager sur d’autres sites

Bonjour @jms

Je rejoins @bonuscad, il nous manque des informations.

Sans compter que ce n'est pas un "programme" qui fonctionne sur AutoCAD, il ne fait jamais que lancer des fonctions Archibus (jamais entendu parler)
Il serait intéressant pour l'apprentissage de connaître ce qui caractérise les locaux à hachurer et le faire en AutoLisp pour que ça fonctionne même si un jour vous n'avez plus Archibus installé sur la machine.

En lisant ce qui est livré je dirais qu'une solution serait de doubler la ligne avec à chaque fois une nouvelle "value"

(AfmHighltQuerySetFIlter (list (list "tableName.fieldName" "value")))

Amicalement

Lien à poster
Partager sur d’autres sites

Bonjour Didier,

Si nous n'avons plus Archibus, c'est qu'il sera remplacé par un autre programme. Lui-même est venu remplacé Geomap, qui fonctionnait d'une manière similaire.

Archibus est un programme qui associe des dessin Autocad à des bases de données. Dans ces dessins, certains objets sont eux-mêmes associés à des tables de ces DB. Les locaux sont en fait des polylignes fermées, qui délimitent donc des locaux, voire des zones. Ces polylignes sont liées à des enregistrements d'une table de locaux (table rm), elle-même liée à un certain nombre de tables (typologies de locaux, types de revêtements de sols, entités de refacturation, niveau de sécurité etc...)

Dans ce LISP, le champ rm_type de la table rmtype (c-à-d la table qui contient toutes les différentes typologies de locaux, définit le type de local que je veux hachurer et la ligne (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) lance la commande de hachure. Sans le filtre, cette dernière commande va hachurer tous les locaux, en utilisant une définition de hachures qui se trouve dans la table rmtype.

Lien à poster
Partager sur d’autres sites

Alors par rapport à la doc en ligne et en faisant la corrélation avec AutocadMap, je serais tenté de proposer ceci, sans aucune certitude.

(AfmHighltQuerySetFIlter (list "OR" (list "tableName.fieldName" "value") (list "tableName.fieldName" "value")))

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien à poster
Partager sur d’autres sites

Merci pour la proposition.

Malheureusement en testant ceci : 

(AfmHighltQuerySetFIlter (list "OR" (list "rmtype.rm_type" "MEETING ROOM") (list "rmtype.rm_type" "SINGLE OFFICE")))

le résultat est un plan avec TOUS les locaux hachurés

Capture.PNG

Lien à poster
Partager sur d’autres sites

Geomap était quand même nettement plus souple et travaillait d'ailleurs sur une base AutocadMap. C'était fort paramétrable, une boîte à outils extraordinaire !

Dommage qu'ils ont fait faillite ... 😞

Lien à poster
Partager sur d’autres sites

Déjà il n'y a pas eu de refus sur la syntaxe et cela a fait quelque chose.

Mais je ne pourrais guère plus t'aider; essayer d'autre syntaxe ? 'OR au lieu de "OR"

Ou scinder la demande en deux...

(or
	(AfmHighltQuerySetFIlter (list (list "tableName.fieldName" "value")))
	(AfmHighltQuerySetFIlter (list (list "tableName.fieldName" "value")))
)

Après je n'ai plus d'idée...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien à poster
Partager sur d’autres sites

La première option est refusée, 'OR ne semblant pas être reconnu, et la seconde ne fonctionne qu'à moitié, puisqu'il ne hachure que le premier type lu, sans générer de message d'erreur.

Grand merci néanmoins pour cette recherche !

Lien à poster
Partager sur d’autres sites

Bonjour @jms

Et en lançant deux routines coup sur coup avec deux listes différentes, ça devrait fonctionner, non ?

Par contre, je m'interroge sur la finalité, les noms étant écrits "en dur" quel gain par rapport à Archibus est-il apporté ?

Ce serait bien d'avoir le DWG pour se rendre compte si on ne pourrait pas faire du LSP propre depuis ces données.

Amicalement

Lien à poster
Partager sur d’autres sites

Oui, bien sûr, en lançant deux routines consécutives (ou trois ou quatre, autant qu'il y a de typologies de locaux qu'on souhaite hachurer, en fait), ça peut marcher. Il faut toutefois changer de layer le résultat de chaque routine, avant de lancer la suivante, car elle efface toutes les hachures de ce layer avant de les régénérer.

Pour la finalité de cet exercice, il s'agit de répondre facilement à certaines demandes récurrentes, dans le genre "Pourriez-vous me sortir les plans de tels étages et de tels bâtiments, avec uniquement les salles de réunion, les copy corner et les coffee corner hachurés ?", par exemple. Archibus permet de produire, en standard, des thématiques complètes, mais pas filtrées. Ici, on y arrive presque.

Il ne s'agit pas de travailler sur un seul DWG ; il y en a des centaines déjà montés en Archibus, et les demandes peuvent en concerner un ou plusieurs.

Lien à poster
Partager sur d’autres sites

Hello @jms

Géomap France n a pas fait faiilite !

J en sais qq chose car j ai travaillé pour Géomap France pendant 12 ans (Environ 2001-2013) !

En fait ils ont fusionne avec Imagis pour devenir le groupe Geomap-Imagis... 

Tous les développements (sauf qq "pépites") sur AutoCAD MAP ET MAPGUIDE ont été abandonnés...

( Le bon vieux MapGuide 6.0/6.3/6.5 etait Tip-Top )

En effet le FM (gère principalement par Géomap Benelux) a ete "totalement" abandonné ! Car c CE Géomap "qui a coulé" !

Suite a la fusion avec Imagis (et a la "poussee" de ESRI France) le "Trésor" Géomap Français a été porté sur ESRI (Arcgis / Arcmap)... 

Depuis le groupe Geomap-Imagis a été rachete par One Spatial il y a 2 ans environ... 

Donc maintenant ils se nomment One Spatial !

La Santé, Bye, lecrabe (triste & fatigué) 

 

  • Like 1

Autodesk Expert Elite Team

Lien à poster
Partager sur d’autres sites

Waouh ! ( Oufti !!! dirait-on à Liège 😉 ) mais que ce monde est petit.

Je savais qu'il restait une "poche Geomap" en France, et c'est d'ailleurs eux qui ont pris le relais quelques temps, après GeomapGis. Pas longtemps d'ailleurs ; on est vite passé à Archibus ; choix proposés par certains, qui connaissent depuis plus de 20 ans.

Il n'empêche, et au rsique de me répéter, Geomap FM était une bien belle boîte à outils, je trouve.

Lien à poster
Partager sur d’autres sites

Bonjour,

 

Une idée peut-être : exécuter 2 fois sans clear pour ne pas effacer les hachures déjà traitées

 

(defun c:USAGES ()
 
   (afm_highlight_init)
   (AfmHighltQueryClear 0 "AR_USAGE-TEST")
   (AfmHighltQuerySetOwner "rmtype")
   (AfmHighltQuerySetAssigned "rm")
   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE")))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)

   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "MEETING ROOM")))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)

   (afm_highlight_done)
   
   (princ)
 
 )

 

Lien à poster
Partager sur d’autres sites

Hello @jms

 

Qq Infos supplementaires sur l'histoire de GEOMAP ... Et sur les investissements de Autodesk dans le monde du SIG/GIS ...

 

1) En 2004 / 2005 Autodesk "croyait" encore au SIG / GIS contre ESRI !

( surtout avec le succes et la rapidite / efficacite de MAPGUIDE v6.x )

 

2) Et donc ils avaient etudie le rachat possible de 2 societes "a la pointe" du SIG/GIS avec AutoCAD MAP :

GEOMAP France et C-PLAN AG Suisse (avec son produit Phare TOPOBASE sur Oracle par dessus AutoCAD MAP)

 

3) Finalement en Juillet 2005 ils ont rachete (environ 18 millions de dollars) C-PLAN AG pour plusieurs raisons dont la principale etait le potentiel SUPERIEUR des nombreux clients germaniques de C-PLAN (Suisse, Allemagne, Autriche, etc) comparativement aux clients Francais de GEOMAP France ...

 

4) Sinon je suis OK avec toi : le potentiel du GGAdmin / GGStudio et du GGRT.arx (par dessus AutoCAD MAP) de GEOMAP etait ENORME

GEOMAP avait meme developpe un cartouche Spatial pour MS-ACCESS en plus du support de Oracle (comme le TOPOBASE de C-PLAN)

 

5) Puis qq annees apres (en 2012 environ) Autodesk "a abandonne" le monde du SIG/GIS en le laissant a ESRI car ils ont decide de s'investir a fond sur l'AEC ... ( REVIT par exemple )

 

6) Si on revient encore plus loin en arriere, Autodesk avait rachete a ARGUS Canada en 1996 un "fabuleux" logiciel : MAPGUIDE

Qui a ete un franc succes surtout avec les versions 6.0/6.3/6.5 ... Et puis apres (en 2006/2007) on est passe a MGES / MGOS ...

 

7) Finalement le TOPOBASE de C-PLAN est devenu les Logiciels Metiers MAP a partir de AutoCAD MAP 2012 et n'a jamais malheureusement beaucoup evolue du fait de l'abandon du monde du SIG/GIS par Autodesk ...

 

La Sante, Bye, lecrabe (triste &fatigue)

 

Autodesk Expert Elite Team

Lien à poster
Partager sur d’autres sites

Coucou,

Je ne connais rien à ces fonctions mais avec la doc que BonusCAD a trouvé, on peut essayer de décortiquer un peu plus le programme :

(afm_highlight_init)
;; This function initializes the Highlighting functionality and clears any previously cached query restrictions.
;; This function should be the first function called as part of the highlighting function sequence.
;; -> Obligatoire

(AfmHighltQueryClear 0 "AR_USAGE-TEST")
;; Clears existing highlighting, query text, and/or highlighting legend from the drawing.
;; nWhich is an integer that specifies which items to clear.
;;      0 clears Highlighting, Query Text, and Legend, 1 cleas Highlighting and Query Text only, 2 clears Legend only.
;; strLayer gives the layer on which Highlighting and Query Text should be cleared.
;; -> Je suppose que c'est cette fonction qui supprime les hachures précédemment créées, empêchant ainsi d'effectuer le programme avec plusieurs
;; type de locaux appartenant au même calque.

(AfmHighltQuerySetOwner "rmtype")
;; These methods set the owner and assigned tables for the by-owner query. These owner and assigned table settings are independent of the current view setting.
;; All asset symbols associated with assigned records, which are assigned to the same owner, will be highlighted with the same pattern.
;; The owner should have a field designated with an ARCHIBUS Type of "Hpattern AutoCAD" to store the description of the hatch pattern for each owner.
;; You can edit these hatch patterns in an ARCHIBUS grid by selecting the cell and calling up a dialog.
;; -> Reste inchangé

(AfmHighltQuerySetAssigned "rm")
;; -> Idem que pour (AfmHightltQuerySetOwner)

(AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE")))
;; This function appends restrictions to be applied when the AfmHighlightQueryByOwner function is called. Any number of restrictions can be included in
;; the list as a single setting, or this function can be called multiple times prior to calling the AfmHighltQueryByOwner method. For more information
;; regarding Filter Syntax, see the section on Filter Syntax. Both the AfmViewSetSqlRest and AfmHighltQuerySetFilter methods provide the same
;; functionality.
;; -> Ne peut être séparée de la fonction (AfmHightlightQueryByOwner). Je n'ai pas trouvé la section Filter Syntax. Quelques possibilités (comme évoquées par BonusCAD) sont :
;; (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE") (list "rmtype.rm_type" "MEETING ROOM")))
;; ou 
;; (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE")))
;; (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
;; (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "MEETING ROOM")))
;; (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)

(AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
;; -> L'aide pour cette fonction est bien trop floue pour bien comprendre son fonctionnement...

(afm_highlight_done)

Le plus gros soucis, c'est que c'est délicat de trouver une solution sans vraiment pouvoir tester... Essaye donc de retirer la fonction de QueryClear pour pouvoir éviter la suppression des hachures existantes sur le calque. Peut-être que le problème vient de là...Tu as deux versions ci-dessous :

(defun c:USAGES ()

   (afm_highlight_init)
;  (AfmHighltQueryClear 0 "AR_USAGE-TEST")
   (AfmHighltQuerySetOwner "rmtype")
   (AfmHighltQuerySetAssigned "rm")
   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE")))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "MEETING ROOM")))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
   (afm_highlight_done)
   
   (princ)
 
)

;; ou

(defun c:USAGES ()

   (afm_highlight_init)
;  (AfmHighltQueryClear 0 "AR_USAGE-TEST")
   (AfmHighltQuerySetOwner "rmtype")
   (AfmHighltQuerySetAssigned "rm")
   (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE") (list "rmtype.rm_type" "MEETING ROOM")))
   (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T)
   (afm_highlight_done)
   
   (princ)
 
)

Bisous,
Luna

Lien à poster
Partager sur d’autres sites

Hélas, hélaaaas @Luna !

Mêmes résultats : pour la première version, c'est pareil. Suivant l'ordre d'inscription du rmtype, ce ne sera que le premier des deux qui sera hachuré.

La seconde version ne donne carrément pas de résultat. Ni message d'erreur.

Je vais tenter de trouver la signification des " 50 nil nil 'T " ...

Lien à poster
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
×
×
  • Créer...