Clément.a Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Bonjour à tous, J'aimerais créer une sources de données ou je placerais un certain nombre d'objet qu'il me faut répertorier.Sans même parler de Lisp pour commencer, j'ai testé manuellement les connexions BD parce que je ne connaissais pas.Déja la j'ai un petit problème.J'ai réussi a créer une source de donnée mais celle-ci est commune à tout les dessins que je vais ouvrir par la suite.Y a t-il un moyen pour les "privatiser" a un seul dessin ? Maintenant pour ce qui est avec le Lisp, je ne sais pas du tout comment ça se passe est ce qu'on utilise (command "dbconnect") ou y à t'il une fonction pour ça... ? Merci
Patrick_35 Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Salut Tu as plusieurs manières de gérer une base de données.Soit par dessin, alors autant utiliser les fonctions natives vlax-ldata...Soit pour un ensemble de dessins. Tout dépend du nombre de données nécessaires.Par les regitres, si ce n'est pas trop important.Par un/des fichier(s) texte.Par un fichier Excel avec des outils comme Api_XlsPar une base de données avec ADOLisp @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 Oui j'aurais créer un fichier excel et donc avec ton lisp Api_Xls que j'ai déja regardé.Mais après comment je fait pour créer un connexion BD pour un dessin?
(gile) Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Ou encore SQLite for LISP. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Oui j'aurais créer un fichier excel et donc avec ton lisp Api_Xls que j'ai déja regardé.Mais après comment je fait pour créer un connexion BD pour un dessin?Comme je te l'ai indiqué précédemment ou on ne se comprend pas. @gileMerci pour le lien, mais l'as tu testé ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Oui, j'avais fait quelques tests à l'époque (2009) et ça fonctionnait bien. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Oui, j'avais fait quelques tests à l'époque (2009) et ça fonctionnait bien.Et par rapport à ADOLisp, tu as des choses en plus ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 A mon avis on se comprend pas en grosse partie parce que je n'ai jamais fait de connexion BD. Je vais vous dire ce que j'aimerais faire : A l'aide d'une routine lisp je dessine plusieur objet (ligne, arc de cerle blocs etc )tous ces objets forment une entitée (exemple schématique : ces objets forment une roue de véhicule, comprenant pneu, jante et un bloc annotatif désignant sa taille). je dessine plusieur roue à l'aide de cette routine dans le même dessin. Et pour une raison x j'aimerais supprimer la roue n°3 donc il faudrait que ça supprime tout les objet formant cette roue. Pour y arriver j'aurais aimé dans mon idée de départ et si c'est possible lier un tableau excel avec deux colones l'une le numéro et l'autre une description et affecter pour chaque ligne tout les objets formant une roue.Ainsi si on veut supprimer la roue n°3 ça séléctionne tout les objets et voilà. Mais pour l'instant avec une connexion BD j'ai créer une base de donnée qui sert pour tout les dessins, c'est a dire je retrouve ma source de données pour chaque nouveau dessins je peut lui lié de nouveau objet etc mais comme pour chaque dessin j'aurais un nombre différent de roue avec des designations différentes ça va pas trop me convenir. Moi je pensais que je pouvais créer un fichier .xls pour chaque dessins et lié à chaque ligne de ma base de donnée que je vennais de créer ce que je voulais.Mais y a sûrement une solution, je compte sur vous pour m'en apprendre encore d'avantage. Merci
Patrick_35 Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Tu peux très bien organiser ta BD dans ton dessin de cette manière (vlax-ldata-put "Mes Roues" "Roue 01" '("32004" "32005" "32006")) (vlax-ldata-put "Mes Roues" "Roue 02" '("31B0A" "31B0B" "31B0C")) Et pour savoir qui est avec qui(vlax-ldata-get "Mes Roues" "Roue 01") Pour retrouver toutes mes Roues(vlax-ldata-list "Mes Roues") ps : les chiffres hexa correspondent aux handles de tes objets qui composent tes roues dans ton dessinpps : Tes objets peuvent très bien être inséré normalement et à toi de dire que ces objets font partie de ta base. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 Du coup j'utilise pas de connexion BD là?J'utilise le Xdata.Donc j'ai pas fichier .xls associé?
Patrick_35 Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Si, tu peux très bien associer un fichier Par exemple(vlax-ldata-put "Mes Roues" "Mon Fichier" "c:/test/test.xls") Ou encore avec les variables d'environnement si tu souhaites un fichier commun(setenv "Mes_Roues_Mon_Fichier" "c:/test/test.xls") A toi de bien réflechir pour faire ce qui est le plus simple car tu as plusieurs solutions. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Salut, Si les données sont à conserver par dessin, je ne vois pas l'intérêt d'utiliser une base de données externe (Excel ou autre) puisqu'un dessin autoCAD est une base de donnée. Ce que tu décris ressemble fort à un 'groupe' AutoCAD. AutoCAD gère ces groupes dans un dictionnaire, ce qui me semble être la solution la plus simple pour ce que tu veux faire.Pour les dictionnaires en LISP, voir ce sujet. Les plus faciles à utiliser sont les ldata (LISP data) même si beaucoup (et non des moindres) recommandent d'éviter de les utiliser. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 (gile) m'a coupé l'herbe sous le pied en demandant le pourquoi d'un fichier Excel @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 A toi de bien réflechir pour faire ce qui est le plus simple car tu as plusieurs solutions.c'est pour ça que j'essaye de voir toute les solutions qui s'offre à moi pour pouvoir faire un choix judicieux.les ldata (LISP data) même si beaucoup (et non des moindres) recommandent d'éviter de les utiliser Pourquoi? 1
(gile) Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Extrait du sujet dont j'ai donné le lien :On a reproché et on reproche encore deux choses aux ldata.La première était un problème de compatibilité entre les différentes version d'AutoCAD, mais ce défaut de jeunesse semble complètement corrigé depuis la version 2002.La seconde est que les ldatas ne sont accessibles qu'en LISP (et ObjectARX/C++ bien sûr), contrairement aux dictionnaires classiques et aux Xrecords qui sont accessibles pour tous les langages de programmation supportés par AutoCAD. En bref, pour les développeurs moins aguerris qui n'utilisent que le LISP, l'utilisation des ldatas est un moyen plus facile pour d'accéder à des dictionnaires. Les développeurs plus avancés et surtout ceux qui utilisent d'autres langages de programmations que le LISP préfèreront les dictionnaires standards qui offrent plus de possibilités et restent accessibles par tous les environnements de programmation. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 J'en suis pas encore la dans le sujet, je finis de lire et j'aurais surement des questions.merci
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 Si je veux conserver des données par dessins avec un dictionnaires, si j'ai bien compris je dois utilisé un dictionnaires nommés puique j'ai que des des données non graphiques. Les dictionnaires ils sont bien attaché et spécfique à chaque dwg? J'ai fait fonctionner les petites routines de début du sujet mais pourquoi quand j'espionne dict je trouve tous ça[0] (-1 . <Nom d'entité: 7ef03500>)[1] (0 . "DICTIONARY")[2] (5 . "218")[3] (102 . "{ACAD_REACTORS")[4] (330 . <Nom d'entité: 7ef01c60>)[5] (102 . "}")[6] (330 . <Nom d'entité: 7ef01c60>)[7] (100 . "AcDbDictionary")[8] (280 . 0)[9] (281 . 1)[10] (3 . "SUPER_DATA_1")[11] (350 . <Nom d'entité: 7ef03508>)c'est un truk que je vien de créer ça veut dire quoi tout ce qu'il y a?Pour les xrecord qu'on met dans le dictionnaire ils sont toujours dans "super_data_1" ou on peut les metres ailleurs.On retrouve la même chose quand on inspect data : [0] (-1 . <Nom d'entité: 7ef03508>)[1] (0 . "XRECORD")[2] (5 . "219")[3] (102 . "{ACAD_REACTORS")[4] (330 . <Nom d'entité: 7ef03500>)[5] (102 . "}")[6] (330 . <Nom d'entité: 7ef03500>)[7] (100 . "AcDbXrecord")[8] (280 . 1)[9] (1 . "Ceci est un test")[10] (40 . 3.14159)bon on voie que la c'est un Xrecord mais c'est quoi ce ACAD_REACTORS et pour quoi la on à que (280.1) alors qu'on avait (280 . 0) (281 . 1) pour le variable dict.
Clément.a Posté(e) le 18 mars 2013 Auteur Posté(e) le 18 mars 2013 La routine pour lister toute les entrés dans un dictionnaires ne marche pas deux fois à la suite et pourquoi elle renvoie que super_data_1 et pas mon_super_dico aussi?
(gile) Posté(e) le 18 mars 2013 Posté(e) le 18 mars 2013 Il semble que tu n'aies pas bien compris l'arborescence des dictionnaires ni que tu ne sois habitué à manipuler les listes DXF.Quand tu crées un objet avec entmake ou entmakex, tu ne spécifies pas forcément tous les groupes DXF, AutoCAD rajoute automatiquement les groupes non spécifiés avec des valeurs par défaut.Essaye :(entmake '((0 . "POINT") (10 0. 0. 0.)))puis fait :(entget (entlast))Regarde la rubrique Références DXF dans l'aide aux développeurs (en français). Les dictionnaires sont organisés de manière hiérarchique (relation parent/enfant si tu préfères)Le dictionnaire racine retourné par (namedobjdict) est le parent de nombreux dictionnaires (dont "MON_SUPER_DICO")."MON_SUPER_DICO" est une entée (un enfant) du dictionnaire racine et c'est un dictionnaire."SUPER_DATA_1" et "SUPER_DATA_2" sont des entrées (des enfants) de "MON_SUPER_DICO" et sont des Xrecord. Ceux sont eux qui contiennent les données. Commence donc plutôt avec les ldata. Un petit exemple d'après ce que j'ai compris que tu cherchais à faire. Pas testé en profondeur, mais ça devrait te donner une idée sur la façon de faire. ;; Crée une "roue" ;; À chaque entité créée est attache un ldata avec l'index (clé = "indexRoue") ;; Un ldata nommé ("clement") avec comme clé l'index sous forme de chaine contient ;; la liste des entités de la roue (defun c:creeruneroue (/ used ind pt ent lst ang n) (vl-load-com) (if (and (setq ind (getindexroue)) (setq pt (getpoint "\nSpécifiez le point d'insertion de la roue: ")) ) (progn (setq pt (trans pt 1 0) ent (entmakex (list '(0 . "CIRCLE") (cons 10 pt) '(40 . 10))) lst (cons ent lst) ) (vlax-ldata-put ent "indexRoue" ind) ; attache l'index à l'entité (setq ent (entmakex (list '(0 . "CIRCLE") (cons 10 pt) '(40 . 12))) lst (cons ent lst) ) (vlax-ldata-put ent "indexRoue" ind) ; attache l'index à l'entité (setq ang (/ pi 6)) (repeat (setq n 12) (setq ent (entmakex (list '(0 . "LINE") (cons 10 pt) (cons 11 (polar pt (* n ang) 10)) ) ) n (1- n) lst (cons ent lst) ) (vlax-ldata-put ent "indexRoue" ind) ; attache l'index à l'entité ) (vlax-ldata-put "clement" (itoa ind) lst) ; crée le ldata "clement" ) ) (princ) ) ;; Affecte l'index à chaque entité de la sélection ;; Crée un ldata nommé ("clement") avec comme clé l'index sous ;; forme de chaine qui contient la liste des entités de la roue (defun c:indexeruneroue (/ ind ss n lst) (if (and (setq ind (getindexroue)) (setq ss (ssget)) ) (progn (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n))) lst (cons ent lst) ) (vlax-ldata-put ent "indexRoue" ind) ; attache l'index à l'entité ) (vlax-ldata-put "clement" (itoa ind) lst) ; crée le ldata "clement" ) ) (princ) ) ;; Sélectionne les entités de la roue pour l'index spécifié (defun c:selectionparindex (/ ind lst ss) (if (progn (initget 6) (setq ind (getint "\nEntrez l'index de la roue: ")) ) (sssetfirst nil (selectionroue ind)) ) (princ) ) ;; Sélectionne les entités de la roue contenant l'entité sélectionnée (defun c:selectionparentite (/ ent lst ss) (if (and (setq ent (car (entsel "\nSélectionnez une entité de la roue: "))) (setq ind (vlax-ldata-get ent "indexRoue")) ) (sssetfirst nil (selectionroue ind)) ) (princ) ) ;; Affiche l'index de la roue à laquelle appartient l'entité sélectionnée (defun c:indexdelaroue (/ ent) (if (setq ent (car (entsel "\nSélectionnez une entité de la roue: "))) (if (setq ind (vlax-ldata-get ent "indexRoue")) (alert (strcat "Index de la roue: " (itoa ind))) (alert "L'entité sélectionnée n'est pas dans une roue") ) ) (princ) ) ;; Retourne un jeu de sélection contenant les entités de la roue ;; ;; Argument : l'index de la roue (defun selectionroue (ind / ss) (if (setq lst (vlax-ldata-get "clement" (itoa ind))) (progn (setq ss (ssadd)) (foreach ent lst (ssadd ent ss)) ) ) ) ;; Retourne une liste des indeices utilisés ;; Les ldata des "roues vides" sont supprimées (defun indexroueutilises (/ lst result) (setq lst (vlax-ldata-list "clement")) (foreach l lst (if (vl-some '(lambda (x) (entget x)) (cdr l)) (setq result (cons (atoi (car l)) result)) (vlax-ldata-delete "clement" (car l)) ) ) result ) ;; Invite l'utilisateur à spécifier un index tant que ;; l'index spécifié est déjà utilisé ;; Retourne l'index (defun getindexroue (/ used ind) (setq used (indexroueutilises)) (while (and (progn (initget 6) (setq ind (getint "\nEntrez l'index pour cette roue: ")) ) (member ind used) ) (alert "Index déjà utlisé") ) ind ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Clément.a Posté(e) le 19 mars 2013 Auteur Posté(e) le 19 mars 2013 Non mais j'ai envie d'apprendre les ditctionnaires j'ai le temps j'ai compris la hiérarchie des dictionnaires nommés mais j'ai pas compris ou pouvait ce metre les dictionnaires d'extension. Et quand est ce qu'on les utilise?
Clément.a Posté(e) le 19 mars 2013 Auteur Posté(e) le 19 mars 2013 Ce que j'aimearais faire c'est avoir dans un xrecord, qui est est classé dans un dictionnaire, les noms d'entités des éléments qui sont dépendant dans le dessin donc à chque fois que je dessine un élément je récupert son nom (setq nom (entlast))mais après comment je fais pour metre ça dans un xrecord c'est ni un réel ni une chaine? qu'el code de groupe faut il metre devant et comment je fait pour avoir une paire pointé pour l'instant j'ai ça :(setq liste (append'((0 . "XRECORD") (100 . "AcDbXrecord") (1 . "Ceci est un test")) (list nom) '((40 . 3.14159) )))qui me renvoie donc cette valeur[0] (0 . "XRECORD") [1] (100 . "AcDbXrecord") [2] (1 . "Ceci est un test") [3] <Nom d'entité: 7ef037a0> [4] (40 . 3.14159)c'est presque ça... De cette façon quand je lancerais ma commande pour supprimer et que je séléctionnerais un élément je pourais retrouver tous les éléments qui lui sont indépendant et pourais tous les supprimer.
Clément.a Posté(e) le 19 mars 2013 Auteur Posté(e) le 19 mars 2013 je suis arrivé jusque la :(setq liste (append '((0 . "XRECORD") (100 . "AcDbXrecord") (1 . "Ceci est un test")) (list(list 1 . (list nom))) '((40 . 3.14159)) )) Ce qui me renvoie la valeur : [0] (0 . "XRECORD") [1] (100 . "AcDbXrecord") [2] (1 . "Ceci est un test") [3] (1 #<SUBR @12dc7dc8 LIST> <Nom d'entité: 7ef037b0>) [4] (40 . 3.14159)
Patrick_35 Posté(e) le 19 mars 2013 Posté(e) le 19 mars 2013 Pour créer un enregistrement de plusieurs objets (en utilisant les handles)(setq xname (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))) (setq dict (dictadd (namedobjdict) "Mes_Roues" xname)) (and (setq js (ssget)) ; sélection de quelques objets, pour l'exemple (progn (setq n 0) (while (setq j (ssname js n)) (setq lst (cons (assoc 5 (entget j)) lst) n (1+ n) ) ) ) ) (setq xrecord (entmakex (append '((0 . "XRECORD") (100 . "AcDbXrecord")) lst))) (dictadd dict "Ma_Roue_01" xrecord) Pour retrouver mon dictionnaire(setq dict (dictsearch (namedobjdict) "Mes_Roues"))Et l'enregistrement n°1(dictsearch dict "Ma_Roue_01") ou (dictnext dict t) et (dictnext dict) pour les suivantsEt en conséquence, avec le code dxf n°5 (handle), tous mes objets @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Clément.a Posté(e) le 19 mars 2013 Auteur Posté(e) le 19 mars 2013 Ah ouais pas mal! j'avais regarder les groupe de code mais j'était dans la rubrique Type de valeur des codes de groupe du coup il précise pas c'est des fourchettes de code.C'est un peut plus court que ça :(defun c:didi () (vl-load-com) (setq xname (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))) (dictadd (namedobjdict) "piquage" xname) (command "ligne" (getpoint "point 1") (getpoint "point 2") "") (setq nom (vl-prin1-to-string (entlast))) (setq j (list '(0 . "XRECORD") (cons 1 nom) )) (setq xrec (entmakex (list '(0 . "XRECORD") '(100 . "AcDbXrecord") (cons 1 nom) '(40 . 3.14159) ))) (dictadd xname "ligne" xrec) ) Merci beaucoup
Clément.a Posté(e) le 19 mars 2013 Auteur Posté(e) le 19 mars 2013 Par contre j'ai encore des question sur le dxf : - Quand je fait (assoc 5 "ma_roue_1")ça me donne que le dernier code dxf n°5comment on fait pour tous les récperer : [9] (5 . "26E")[10] (5 . "222")[11] (5 . "21F")[12] (5 . "221")[13] (5 . "220") - C'est quoi ce code dxf n°5 avec (5 . "22F") je la réutilise comment cette valeur pour modifier mes objets, les séléctionner etc...--> j'ai trouver avec la fonction handent :D Merci
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant