Aller au contenu

Filtre lisp pour les object Data


GEGEMATIC

Messages recommandés

salut à tous,

je crée un nouveau sujet car celui d'origine à légèrement dévié.

 

Je propose en version ultra-beta une dll qui permet de filtrer les entité par leur table,

à partir d'une commande avec une case de dialogue:

ODSELECT

 

puis, et c'est je pense plus intéressant, deux commandes lisp,

qui permettent de sélectionner, sans dialogue, par table ou par table, champ et val

ces deux commandes sont SelParTablelsp et SelParODVal , elle retournent un liste contenant un jeu de sélection

 

'Sélection par table

'exemple: (SelParTablelsp "MATABLE" ) -> (<Selection set: 74>)

'

 

'Sélection par table, champ et valeur, la valeur doit toujours être une chaine

'exemple: (SelParODValLsp "MATABLE" "MONCHAMP" "myValAlwaysAsStr") -> (<Selection set: 74>)

'concret: (SelParODValLsp "E-TRONCO" "DIAMETRE" "100") -> (<Selection set: 74>)

 

Il faut charger les 2 dll, puis ouvrir un autre dessin pour pouvoir les tester (l’initialisation des commandes ne se fait pas correctement au chargement, très bien sur une ouverture de fichier)

 

Ces commandes sont rugueuses, on est loin de l'excellent Mqselect, il n'y pas possibilité d'ajouter des opérateurs aux requêtes, la casse doit être strictement respectée, et les valeurs doivent toujours être présentées sous forme de chaine.

mais je pense qu'en partant d'une sélection par table, on peut affiner son traitement en lisp sur un jeu réduit, on gagnera quand même beaucoup de temps : un exemple de benchmark: 5.2 s pour sélectionner 992 objets parmis les 42785 entité d'un dessin, toutes les entités ayant des OD ...

 

Merci de tester avec 2013 à 2016, car ça marche très bien chez moi, mais pas chez Bonuscad !

Gégé

 

 

la pièce jointe est supprimée, voir dans les messages suivants.

Modifié par GEGEMATIC

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Donc sur AutoCad Map 2014 (OS: Windows 7 64bits)

 

Pas de souci avec ODSELECT.

 

Avec SelParTablelsp et SelParODVal par contre...

Bien qu'ils me retournent bien un nombre d'objets placés dans un "Selection set", pas moyen d'obtenir cette sélection effective.

Il n'y a aucune sélection dans la fenêtre de propriété.

Si je fais un "SELECT" "_previous" seul ma dernière sélection est retournée, qui n'a rien à voir avec la sélection faite par SelParTablelsp ou par SelParODVal....

 

Soit je m'en sert mal (c'est possible) ou soit ton jeu de sélection n'est pas valide pour être reconnu comme une sélection. Ce qui me fait dire ceci est que j'ai essayé en lisp la fonction suivante:

(sssetfirst nil (SelParTablelsp "RD_METADATA"))

et en retour j'ai:

21416 objects in the drawing

Sélection des objets de la table RD_METADATA dans l'espace objet

1843 objects selected with data; erreur: type d'argument incorrect: lselsetp (<Selection set: 517>)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut et merci du test, je me posais beaucoup de question sur la manière dont j'utilisais les références

Salut,

Donc sur AutoCad Map 2014 (OS: Windows 7 64bits)

Pas de souci avec ODSELECT.

Avec SelParTablelsp et SelParODVal par contre...

Bien qu'ils me retournent bien un nombre d'objets placés dans un "Selection set", pas moyen d'obtenir cette sélection effective.

je suis donc déjà content qu'odselect marche chez toi,

pour les fonctions lisp, d'après ce que j'ai compris, on ne peut que retourner nil (liste vide finalement) ou une liste de résultat

donc les fonctions lisp retournent '(<sset>)

pour avoir le le js, il faut faire (car (SelParTablelsp "RD_METADATA"))

et

(sssetfirst nil (car (SelParTablelsp "RD_METADATA")))

si ça marche c'est bien !

Gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Soit je m'en sert mal (c'est possible)

 

C'est confirmé, car avec ta suggestion: (sssetfirst nil (car (SelParTablelsp "RD_METADATA"))), ça fonctionne!

Je n'avais pas fais attention que le retour était une liste. :rolleyes:

 

Donc c'est OK pour l'instant avec des tests rapides.

 

Le temps de traitement reste correct, pas de latence exagérée, c'est bien.

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

Lien vers le commentaire
Partager sur d’autres sites

merci encore,

donc je reposte une version plus rationnelle, plus simple, pour que l'on puisse l'utiliser largement en lisp.

Il faut que le framework 4.5 soit installé.

 

il n'y a plus qu'une dll, j'ai supprimé les fonctionnalités d'échange lisp/net

il reste donc :

 

une commande autocad, odselect, avec case de dialogue, qui grippe les entités

 

2 commandes lisp :

 

Lisp command SelParTablelsp : (SelParTablelsp "TABLE" ) -> (<Selection set: 74>)

Lisp command SelParODValLsp : (SelParODValLsp "TABLE" "CHAMP" "myVal") -> (<Selection set: 74>)

ces 2 commandes retournent soit une liste contenant un jeu de sélection, soit nil

 

Gégé

ODselect.zip

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Aïe ! ça pince !

SVP ca fonctionne sur les 4 types de champ OD : Integer, Real, String & Point (que je n'utilise jamais) ??

Bye, lecrabe

 

Oui ça marche mais c'est vraiment pas terrible:

l'argument doit être obligatoirement une chaine, (sauf pour les integer, ou la conversion est automatique)

donc pour les chaines et les integer, aucun problème

pour les réels et les points, ça se complique:

il faut que la chaine représente le réel retourné en fonction de la variable LUPREC

si LUPREC = 3, la valeur réele 1.2555 est affichée 1.256

donc :

(SelParODValLsp "E-TRONCO" "ZAMONT" "1.256") marche très bien, mais pas (SelParODValLsp "E-TRONCO" "ZAMONT" "1.2555")

Pour les points, c'est pareil

 

avec Luprec = 3

pour chopper les points 0,0,0

(SelParODValLsp "POINT" "PNT" "0.000,0.000,0.000")

 

Je sais que ce n'est pas un fonctionnement convenable, mais ça peut rendre service quand même.

le problème c'est que les informations sur une valeur et la valeur elle même ne sont pas au même endroit, il faut donc que je reprenne un peu mon code pour pouvoir anticiper le type de valeur que j'attends, car je pensais le faire en partant de ce que l'utilisateur demande, mais ça marche pas, car si je demande 100, je veux avoir aussi 100.0000

 

Voilà, j'espère améliorer les choses bientôt !

Gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Integer, Real, String : c OK pour moi !

 

1) Est ce que l'on peut passer un Integer normal directement, ca serait bien !?

En fait c quoi ta syntaxe correcte ?

(SelParODValLsp "E-TRONCON" "NO_CANA" "123")

ou

(SelParODValLsp "E-TRONCON" "NO_CANA" 123)

 

2) Pour les reels, l'ideal serait de passer un parametre supplementaire de precision : 1 / 0.1 / 0.01 / 0.001

( FUZZ parameter )

 

3) Et les points, on (Votre serviteur en fait) s'en fout !

Car dans ce cas, j'ai toujours 3 champs reels/flottants: X , Y , Z

 

SORRY, je suis un peu enquiquineur, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Integer, Real, String : c OK pour moi !

 

1) Est ce que l'on peut passer un Integer normal directement, ca serait bien !?

En fait c quoi ta syntaxe correcte ?

 

(SelParODValLsp "E-TRONCON" "NO_CANA" 123)

ça ça marche, c'est bon !

 

2) Pour les reels, l'ideal serait de passer un parametre supplementaire de precision : 1 / 0.1 / 0.01 / 0.001

( FUZZ parameter )

dans ce cas, il faut rappeler qu'il s'agit d'une commande lisp, utilisée dans un cadre lisp (car sinon MQSELECT d'Olivier en fait beaucoup plus ) donc on peut trsè bien précéder son instruction d'un (Setvar "LUPREC" 2)

ça équivaut a un un fuzz = 0.01

3) Et les points, on (Votre serviteur en fait) s'en fout !

Car dans ce cas, j'ai toujours 3 champs reels/flottants: X , Y , Z

Pareil pour moi, je n'ai jamais utilisé ce format ...

SORRY, je suis un peu enquiquineur, Bye, lecrabe

Mais non !

ces commandes évolueront, et c'est bien d'avoir différents avis ...

Je me suis décidé car ces problèmes de recherche me font perdre beaucoup de temps à cause du temps de traitement en lisp, du coup j'ai pensé que ça valait le coup de perdre un peu de temps la dessus ...

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous,

j'ai finalement terminé une version assez propre d'Odselect, et j'ai fini par accéder aux demandes ducrabe, avec des argument précision, case sensitive et tout le toutim.

 

j'ai fait un article sur mon blog ici

 

Je fais un doublon de ce message sur Géorezo

 

j'espère que ça fonctionnera bien chez vous !

 

Gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité