Aller au contenu

Messages recommandés

Posté(e)

Bonjour à toutes et tous,

 

Je voulais tester ce Lisp et voici ce que me retourne AutoCAD =>

 

Commande: EXPORT-TEXT

Sélectionner les textes (ou Entrée pour "Tout").

Choix des objets: 1 trouvé(s)

Choix des objets:

; erreur: type d'argument incorrect: stringp nil

Commande:

 

Le Lisp =>

 

 (defun c:export-text (/ ss path sep file n elst lst typ jus vert ins)
(and
(princ
"\nSélectionner les textes (ou Entrée pour \"Tout\")."
)
(or (setq ss (ssget '((0 . "*TEXT,INSERT"))))
(setq ss (ssget "_X" '((0 . "*TEXT,INSERT"))))
)
(setq path (getfiled "Fichier d'exportation des textes"
(getvar "DWGPREFIX")
"*"
1
)
)
(or (and (= (strcase (vl-filename-extension path) T) ".xls")
(setq sep "\t")
)
(and (member (strcase (vl-filename-extension path) T)
'(".txt" ".csv")
)
(setq sep (getstring "\Entrez le séparateur: "))
)
)
(setq file (open path "w"))
;; En-tête =======================================;;
(write-line
(strcat "Compteur" sep "Type" sep "Calque" sep "Style" sep
"X" sep "Y" sep "Z" sep
"Justification" sep "Hauteur" sep "Rotation"
sep "Valeur"
)
file
)
;;================================================;;
(repeat (setq n (sslength ss))
(setq elst (entget (ssname ss (setq n (1- n)))))
(if (= (cdr (assoc 0 elst)) "INSERT")
(if (and (= (cdr (assoc 66 elst)) 1)
(setq att (entnext (cdr (assoc -1 elst))))
)
(while (= (cdr (assoc 0 (entget att))) "ATTRIB")
(setq lst (cons (entget att) lst)
att (entnext att)
)
)
)
(setq lst (cons elst lst))
)
)
(mapcar
(function
(lambda (elst)
(setq typ (cdr (assoc 0 elst))
vert (cond
((= typ "TEXT") 73)
((= typ "ATTRIB") 74)
)
)
(cond
((member typ '("TEXT" "ATTRIB"))
(setq jus (cond
((= (cdr (assoc vert elst)) 3) "H")
((= (cdr (assoc vert elst)) 2) "M")
((= (cdr (assoc vert elst)) 1) "B")
(T "")
)
jus (cond
((= (cdr (assoc 72 elst)) 0) (strcat jus "G"))
((= (cdr (assoc 72 elst)) 1) (strcat jus "C"))
((= (cdr (assoc 72 elst)) 2) (strcat jus "D"))
((= (cdr (assoc 72 elst)) 3) (strcat jus "A"))
((= (cdr (assoc 72 elst)) 4) (strcat jus "M"))
(T (strcat jus "P"))
)
ins (if (= jus "G")
(trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0)
(trans (cdr (assoc 11 elst)) (cdr (assoc 210 elst)) 0)
)
)
)
((= typ "MTEXT")
(setq jus (cond
(((((T "B")
)
jus (cond
((member (cdr (assoc 71 elst)) '(1 4 7)) (strcat jus "G"))
((member (cdr (assoc 71 elst)) '(2 5 8)) (strcat jus "C"))
(T (strcat jus "D"))
)
ins (cdr (assoc 10 elst))
)
)
(T
(setq jus "G"
ins (cdr (assoc 10 elst))
)
)
)
(write-line
(strcat (itoa (setq n (1+ n)))
sep
(cdr (assoc 0 elst))
sep
(cdr (assoc 8 elst))
sep
(cdr (assoc 7 elst))
sep
(rtos (car ins))
sep
(rtos (cadr ins))
sep
(rtos (caddr ins))
sep
jus
sep
(rtos (cdr (assoc 40 elst)))
sep
(angtos (cdr (assoc 50 elst)))
sep
(cdr (assoc 1 elst))
)
file
)
)
)
lst
)
(close file)
)
(princ)
) 

 

Désolé, là non plus je ne sais pas qui est l'auteur,...

 

Une idée ?

 

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

  • Réponses 56
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Posté(e)

Ça fonctionne très bien chez moi.

 

Après le choix des objets, tu devrais avoir une boite de dialogue pour choisir le fichier, puis une invite pour saisir le séparateur.

 

PS : pour connaître l'auteur, une recherche dans les forums...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

Merci encore,...

 

En fait, cela n'a pas l'air de marcher avec une V2007 de Office. J'ai enregistrer un fichier vierge au format 2003, j'ai retesté, alors là, plus de problème !

 

puis une invite pour saisir le séparateur.

,

 

 

Tiens, je n'ai pas accès à cette invite, moi ??

 

PS : pour connaître l'auteur, une recherche dans les forums...

 

Oui ! J'ai réussit à retrouver des Auteurs, mais pas tous,...

 

C'est vrai que c'est pratique quand l'auteur l'indique dans le Lisp.(tu en fais parti!)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

En fait, cela n'a pas l'air de marcher avec une V2007 de Office. J'ai enregistrer un fichier vierge au format 2003, j'ai retesté, alors là, plus de problème !

Je n'ai pas Office2007, je ne peux donc pas voir d'où ça vient (un problème de séparateur ?).

 

Tiens, je n'ai pas accès à cette invite, moi ??

J'avais relu le LISP trop vite, il n'est demandé de spécifier le séparateur que si l'extension du fichier est txt ou csv. Pour les fichiers xls, le séparateur est d'office une tabulation (peut-être que le problème avec Excel2007 vient de là ?...)

 

C'est vrai que c'est pratique quand l'auteur l'indique dans le Lisp.([surligneur]tu en fais parti![/surligneur])

La preuve que non, je n'avais pas "signé" celui-ci.

Tu peux toujours rajouter des lignes de commentaire au début du code, chacune précédée d'un point-virgule (voir ici)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

Ah, celui-ci aussi est de toi ?!

 

Merci également pour le rappel du lien.

 

Je profite de ce post (plutot qu'en relancer encore un) pour te demander encore un renseignement (un de plus !). Pourquoi lorsque je lance ins-pts, PNT2BLK ,ou encore ins-vtx , AutoCAD me retourne =>

Choix de l'objet: ; erreur: nombre d'arguments insuffisants
, ou bien

Choix de l'objet: ; erreur: type d'argument incorrect: stringp nil
.

 

On en avait déjà parlé mais aujourd'hui, j'ai un mal de chien avec l'internet, alors...

 

Si tu peux me raffraichir la mémoire,...

 

Merci d'avance.

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

A priori, après avoir repris ma config précédente, c'était le lisp "Getname" qui posait pb.

 

:casstet: Aucun des LISP cités (ins-vtx, ins-pts ou pnt2blk) n'utilise "getname" (il me semble que dans les LISP que j'ai publié seul Pline_Block utilise getname).

 

Je pense plutôt que le problème vient (encore une fois) d'un conflit entre plusieurs définitions de GetBlock (avec ou sans DCL séparé).

 

Quand on publie un LISP, on y adjoint les routines nécessaire à son fonctionnement de manière à ce qu'il fonctionne de manière "autonome".

Plusieurs LISP peuvent faire appel à la même routine qu'on retrouve donc dans plusieurs fichiers.

Si les routines ont eu des versions différentes, cela peut générer des conflits.

 

Une meilleure organisation des fichiers permet d'éviter ceci et d'alléger quelque peu la bibliothèque de LISP.

Il s'agit de mettre les routines utilisées par plusieurs programmes dans un ou plusieurs fichiers et de les charger systématiquement à chaque démarrage d'un nouveau dessin pour qu'elles soient toujours disponibles ; par exemple, ajouter (load "dialog") au fichier acaddoc.lsp pour que les boites de dialogues (getblock, getlayer, getlayers, inputbox, doubleinputbox et getlayout) soient systématiquement chargées.

On supprime ensuite toutes les autres définitions de ces routines des fichiers qui les contiennent.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour à toutes et tous,

 

Aucun des LISP cités (ins-vtx, ins-pts ou pnt2blk) n'utilise "getname"

 

Intéresant,... Fait du hasard, alors ??

 

(load "dialog") au fichier acaddoc.lsp

 

Je vais le faire de suite,

 

On supprime ensuite toutes les autres définitions de ces routines des fichiers qui les contiennent.

 

Et comment fais-ton STP ?

 

Je me rapelle qu'il y avait des conflits quand je faisait des test.

 

Il était grand temps, que je fasse du tri,...

 

Je continu et te remercie encore de tes conseils,..

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Pour supprimer les définitions de sous routines dans les fichiers, il suffit de les effacer et d'enregistrer le fichier.

 

Pour une meilleure lisibilité, tu ouvres le fichier dans l'éditeur Visual LISP (VLIDE), tu le formates (CTRL+ALT+F) puis tu cherches le defun de la routine (parfois précédé d'un commentaire), par exemple (defun getblock ...). Tu double cliques juste devant la parenthèse avant defun et toute la routine est sélectionnée, tu l'effaces (le commentaire aussi), tu enregistres (CTRL+S) et tu fermes la fenêtre. ceci pour tous les fichier faisant appel à des boites de dialogue définies dans Dialog.lsp.

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

il y a t-il un nombre maximum de lisp que l'on peut charger dans un .CUI partiel ?

 

Pas à ma connaissance, de plus un LISP peut contenir plusieurs routines (je charge une bibliothèque de plus de 100 routines dans un seul fichier LISP avec mon fichier mNL)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

Merci encore.

 

Je continu alors mon grand menage de printemps.

 

Si tu as le temps, peux-tu développer la démarche STP ?

 

100 routines dans un seul fichier LISP avec mon fichier mNL)

 

Moi, pour le moment, je charge les lisp avec mon fichier .CUI partiel, est-ce la bonne méthode ?

 

Merci d'avance.

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Si tu as un fichier CUI partiel nommé lili.CUI par exemple, tu peux créer un fichier MNL du même nom : lili.mnl. Ce fichier (un peu comme acaddoc.lsp) est un fichier de chargement automatique de routines LISP, il sera chargé en même temps que le CUI et il doit contenir des expressions LISP.

Dans ce fichier, soit tu colles le contenu les LISP nécessaires à ton CUI, soit, mieux, des appels au chargement de ceux-ci. Cette deuxième méthode permet une meilleure gestion (mises à jour) des LISP qui doivent être dans un répertoire dont le chemin est ajouté aux chemins de recherche.

 

Par exemple;

(load "Dialog")

pour charger 6 routines (getblock, getlayer, getlayers, getlayouts, inputbox et doubleinputbox), on peut faire ainsi pour tous les fichier contenant des sous routines.

 

Pour les "commandes" définies en LISP, on peut utiliser la même méthode (load "increment") ou, pour éviter de trop "gonfler" le chargement, utiliser la fonction autoload. Avec cette fonction, le fichier LISP n'est pas chargé à l'ouverture de chaque nouveau dessin mais seulement à l'appel d'une des commandes qui y sont définies.

La syntaxe est (autoload "NomDuFichier" '("commande1" "commande2" ...))

par exemple pour incrément :

(autoload "increment" '("incsuf" incsel" "incatt" "inctxt" "incadd" "incr"))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

Merci encore pour ces riches conseils !

 

Je vais sérieusement me pencher sur le problème dans les semaines qui arrivent,...

 

Je risque donc de revenir,..

 

Merci également des exemples très représentatif, je devrai pouvoir m'en sortir à présent.

 

Merci encore (gile) et bonne fin de WE.

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Re,

 

Voici un extrait de mon fichier "acaddoc.lsp" et cela ne fonctionne pas !

J'ai donc raté une étape,..

 

(setvar "SHORTCUTMENU" 27)

(vl-load-com)

(load "Dialog")

(autoload "increment" '("incsuf" incsel" "incatt" "inctxt" "incadd" "incr"))

(load "lxl")

(load "ssatt")

 

Je continu de chercher,...

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Si tu utilises la fonction load, l'argument doit être le nom du fichier si le fichier est dans un répertoire du chemin de recherche sinon le chemin complet du fichier.

 

Donc (load "lxl") fonctionne si le fichier lxl.lsp est enregistré dans un répertoire du chemin de recherche.

 

Si ssatt est défini dans le fichier Special_selections.lsp, lui même enregistré dans un répertoire du chemin de recherche, il faut faire (load "Special_selections") et pas (load "ssatt).

 

Mais tu peux aussi utiliser autoload:

(autoload "Special_selections" '("ssc" "ssl" "sse" "sstl" "ssatt" "sscu" "ssof" "ssoc" "inv_sel"))

ainsi, le fichier Special_selection.lsp ne sera chargé que lors du premier appel de l'unse de ces commandes.

 

[Edité le 13/4/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

Pour utilser cette technique =>

 

Mais tu peux aussi utiliser appload:
,

 

Est-ce que je peux écrire ? =>

 

(appload "lxl" )

 

l'argument doit être le nom du fichier

 

Ok ! Je pensais que c'était le nom de lancement de la routine,...

 

Je repart de zéro et teste.

 

Merci encore,...

 

 

 

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Soit tu fais (load "lxl") et le LISP est systématiquement à chaque ouverture de nouveau dessin.

Soit tu fais (appload "lxl" '("lxl")) et il faut 2 arguments : le nom du fichier et une liste contenant le (ou les) nom(s) de(s) commande(s) dont le lancement génèrera le chargement du fichier.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Le deuxième devrait fonctionner si les fichiers acaddoc.lsp, Dialog.lsp, Special_selection.lsp, increment.lsp et lxl.lsp sont bien dans un répertoire du chemin de recherche des fichier de support.

 

Sinon, on peut faire plus simple en chargeant systématiquement tous les fichiers .lsp du répertoire spécifié, en mettant l'expression suivante dans le fichier acaddoc.lsp (ou AutoCAD.mnl) après avoir remplacé "C:\\Personnalisation AutoCAD\\LISP" par le chemin complet dudit répertoire.

 

(foreach f (vl-directory-files "C:\\Personnalisation AutoCAD\\LISP" "*.lsp" 1) (load f)) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

Le deuxième devrait fonctionner si les fichiers acaddoc.lsp, Dialog.lsp, Special_selection.lsp, increment.lsp et lxl.lsp sont bien dans un répertoire du chemin de recherche des fichier de support.

 

Pourtant, rien y fait !

 

Pour moi, ça serait donc =>

 

(foreach f (vl-directory-files "D:\\AUTOCAD -PERSONNALISATION\\PROGRAMMES\\LISP" "*.lsp" 1) (load f))
,

puisque =>

 

<!--url{0}-->

 

 

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Pour moi, ça serait donc =>

 

(foreach f (vl-directory-files "D:\\AUTOCAD -PERSONNALISATION\\PROGRAMMES\\LISP" "*.lsp" 1) (load f))

 

Exact.

 

Mais c'est curieux que l'autre méthode ne fonctionne pas.

 

Essaye d'ajouter à la fin de ton fichier acaddoc.lsp l'expression:

(alert "OK")

 

Tu devrais avoir une petite boite de dialogue qui s'ouvre à l'ouverture de chaque nouveau dessin.

Si ce n'est pas le cas c'est que le problème vient de ce que ce fichier n'est pas chargé.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é