Aller au contenu

Connexion BD


Clément.a

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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_Xls

Par une base de données avec ADOLisp

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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.

 

@gile

Merci pour le lien, mais l'as tu testé ?

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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. :rolleyes:

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

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 dessin

pps : 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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?
  • Downvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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 suivants

Et en conséquence, avec le code dxf n°5 (handle), tous mes objets

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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)
 )

:rolleyes:

 

Merci beaucoup

Lien vers le commentaire
Partager sur d’autres sites

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°5

comment 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

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é