Aller au contenu

modifier un programme !!


Messages recommandés

Posté(e)

bonjour à tous,

 

bon voilà j'ai une routine lisp et je veux l'adapter à mes besoins..

 

* j'ai travaillée mes plans dans un seul fichier (*.dwg)qui regroupe pleusieurs calques.

le calque "cartouche" doit apparaitre dans tous mes calques ok !

 

* alors maintenant j'ai trouvée un programme qui explose tous les calques en prennant le nom du fichier plus le nom du calque (exemple : KAM8400 - 007) jusqu'ici c'est impécable !

 

* mais la seule contrainte c'est que quand j'accéde à mon fichier je ne vois rien il faut que j'active manuellement mon calque exemple : 007 pour afficher le contenu de ce dernier aprés je fait encore "purger " !

 

*et puis le calque "cartouche" il le met lui aussi dans un fihier à part alors que ce dernier doit apparaitre dans tous mes plans exploser en .dwg

 

voilà le programme que j'ai trouvée :

 

(Defun EL_listlayer ( / tmp ll)
 (setq tmp (tblnext "LAYER" t)
ll (list (cdr (assoc 2 tmp)))
 )
 (while (setq tmp (tblnext "LAYER"))
   (setq ll (cons (cdr (assoc 2 tmp)) ll))
 )
 ll
)
;;---fin-----------------------------------------------------EL_listlayer--------


;;---Début---------------------------------------------------C:EXPLODELAYER------
;; << crée des wblocs avec les layers d'un dessin                              >>
;; <<                                                                          >>;;
;-------------------------------------------------------------------------------
(Defun C:EXPLODELAYER ( / llay nomfich nomdir)
 (command "_undo" "_m")
 (setq llay (EL_listlayer)
nomfich (getvar "dwgname")
nomdir (getvar "dwgprefix")
nomfich (substr nomfich 1 (- (strlen nomfich) 4))
 )
 
 (mapcar '(lambda (lname / sel)
            (setq sel (ssget "x" (list (cons 8 lname))))
     (if sel
       (command "_wblock" (strcat nomdir nomfich "-" lname) "" (list 0 0) sel "")
     )
   		    
    )
    llay
 )
 (command "_undo" "_b")
 (princ)
)

 

 

s'il vous plait, encore un service que je vous demande, ;)

 

* j'aimerais comprendre la signification de ces lignes :

 

(Defun ..... ( / llay nomfich nomdir)

defun c'est pour commencer une nouvelle fonction mais ce qui est ecrit entre ( ) pourquoi on le met ?

 

(setq ll (cons (cdr (assoc 2 tmp)) ll))

 

(mapcar '(lambda (lname / sel)

(setq sel (ssget "x" (list (cons 8 lname))))

(if sel

(command "_wblock" (strcat nomdir nomfich "-" lname) "" (list 0 0) sel "")

)

 

)

llay

 

 

 

 

merci de votre aide

 

amicalement

doua

 

 

 

 

 

 

 

Posté(e)

Salut,

 

Tu poses beaucoup de questions dans un seul message !

 

Je vais déjà essayer de répondre d'abord à la première.

citation extraite du message original:

 

(Defun ..... ( / llay nomfich nomdir)

 

 

defun c'est pour commencer une nouvelle fonction mais ce qui est ecrit entre ( ) pourquoi on le met ?

 

Defun (DEfine FUNction) c'est pour définir une fonction, cette fonction peut nécessiter des arguments et il est aussi possible de déclarer les variables locales utilisées dans la fonction. Il faut de toute façon mettre une liste d'arguments après un (defun... même si celle-ci est vide. les arguments sont écrits directement après la parathèse ouvrante, les variables locales après le slash (/) :

 

(defun fonction () ...)

ou

(defun fonction (arg1 arg2 ...) ...)

ou

(defun fonction (/ var1 var2 ...) ...)

ou encore

(defun fonction (arg1 arg2 ... / var1 var2 ...) ...)

 

pour plus d'explications sur la déclaration des variables locales tu peux aller voir ici ou encore

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

Posté(e)

Re,

 

Deuxième question.

 

(setq ll (cons (cdr (assoc 2 tmp)) ll))

 

tmp contient la liste associative (ou liste de paires pointées) retournée pa la fonction tblnext pour la table des calques, cette liste est du type :

 

((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous"))

 

(assoc 2 tmp) retourne (2 . "0") une paire pointée.

 

(cdr (assoc 2 tmp)) retourne "0"

 

(cons (cdr (assoc 2 tmp)) ll) ajoute "0" au début de la liste ll

 

(while (setq tmp (tblnext "LAYER"))

(setq ll (cons (cdr (assoc 2 tmp)) ll))

)

Boucle tant qu'il existe des calques dans le dessin et ajoute pour chacun le nom de ce calque à la liste ll.

 

La première fonction aurait pu être définie de manière plus concise :

 

(Defun EL_listlayer (/ tmp ll)
 (setq	tmp (tblnext "LAYER" t))
 (while  tmp
   (setq ll (cons (cdr (assoc 2 tmp)) ll)
  tmp (tblnext "LAYER"))
 )
 ll
) 

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

Posté(e)

Re re,

 

Troisième question:

(mapcar '(lambda (lname / sel)

(setq sel (ssget "x" (list (cons 8 lname))))

(if sel

(command "_wblock"

(strcat nomdir nomfich "-" lname)

""

(list 0 0)

sel

""

)

)

)

llay

)

 

La fonction mapcar fait passer tous les membres d'une (ou de plusieurs) liste comme arguments d'une fonction. Dans le cas présent, une fonction lambda (qui, à la différence d'une fonction defun, n'a pas de nom et n'est pas enregistrée) est appliquée à tous les membres de llay (la liste des noms de calques).

 

L'argument (b]lname[/b] et la variable localesel sont déclarés comme explique dans la réponse 1 pour defun.

 

L'argument est utilisé ici dans le filtre de sélection de tous les objets dudit calque :

(setq sel (ssget "x" (list (cons 8 lname))))

et pour le nom du fichier :

(strcat nomdir nomfich "-" lname)

 

S'il y a des entités sur le calque (sel n'est pas nil) un wbloc est créé avec ces entités.

 

En espérant avoir répondu suffisamment clairement à tes questions.

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

Posté(e)

J'ai un peu modifier le code que tu as trouvé (il y a d'autres ici) pour que les objets du calque "cartouche" soient dans tous les fichiers.

 

J'ai surligé [surligneur]les ajouts[/surligneur]

 

(Defun EL_listlayer (/ tmp ll)
 (setq	tmp (tblnext "LAYER" t)
ll  (list (cdr (assoc 2 tmp)))
 )
 (while (setq tmp (tblnext "LAYER"))
   (setq ll (cons (cdr (assoc 2 tmp)) ll))
 )
 ll
)
;;---fin-----------------------------------------------------EL_listlayer-- ------


;;---Début---------------------------------------------------C:EXPLODELAYER ------
;; >
;; >
;;-------------------------------------------------------------------------- -----
(Defun C:EXPLODELAYER (/ old_echo llay nomfich nomdir)
 (command "_undo" "_m")
 [surligneur](setq old_echo (getvar "cmdecho"))
 (setvar "cmdecho" 0)[/surligneur]
 (setq	llay	(EL_listlayer)
nomfich	(getvar "dwgname")
nomdir	(getvar "dwgprefix")
nomfich	(substr nomfich 1 (- (strlen nomfich) 4))
 )

 (mapcar '(lambda (lname / sel [surligneur]cart sel2 n[/surligneur])
     (setq sel (ssget "x" (list (cons 8 lname))))
     (if sel
       [surligneur](progn
	 (setq cart (ssget "_X" '((8 . "cartouche"))))
	 (command "_copy" cart "" "" "")
	 (setq sel2 (ssget "_P"))
	 (repeat (setq n (sslength sel2))
	   (ssadd (ssname sel2 (setq n (1- n))) sel)
	 )[/surligneur]
	 (command "_wblock"
		  (strcat nomdir nomfich "-" lname)
		  ""
		  (list 0 0)
		  sel
		  ""
	 )
       [surligneur])[/surligneur]
     )

   )
 [surligneur](vl-remove "cartouche"[/surligneur] llay[surligneur])[/surligneur]
 )
 (command "_undo" "_b")
 [surligneur](setvar "cmdecho" old_echo)[/surligneur]
 (princ)
) 

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

Posté(e)

salut gile ,

 

merci infinement pour ton aide précieuse , et ta réponse rapide !

 

on fait gile pour : je m'excuse pour mes questions

 

Tu poses beaucoup de questions dans un seul message !

 

vraiment je m'excuse !!

 

ok merci encors gile !! ;)

 

amicalement

doua

 

 

Posté(e)

vraiment je m'excuse !!

 

Ne t'excuses pas ;)

 

Je disais juste çà parce que je n'étais pas sûr de pouvoir répondre à toutes les questions en un seul message.

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

Posté(e)

bonjour gile,

 

on fait j'ai tester le programme que tu m'as modifier et il me donne toutjour

(explodelayer commande inconnu !) je sais pas pourquoi ?

 

et en plus j'ai pris les trois autres programmes qui ce trouve dans le lien que tu m'a donné et

j'arrive pas à les exécutés ! pourtant je fait le nom "X"qui suit toujour la fnction (defun X()

et ça marche pas ..?! :casstet:

 

 

 

voilà un copie des programme :

 

celui de bonuscad :

 

(defun expl ()
((lambda ( / def_lay nam_lay js)
(setq def_lay (tblnext "LAYER" T))
(setq nam_lay (cdr (assoc 2 def_lay)))
(cond
((setq js (ssget "_X" (list (cons 8 nam_lay))))
(command "_.-wblock" (strcat (getvar "dwgname") "$" nam_lay) "" "*0.0,0.0,0.0" js "")
)
)
(while (setq def_lay (tblnext "LAYER"))
(setq nam_lay (cdr (assoc 2 def_lay)))
(cond
((setq js (ssget "_X" (list (cons 8 nam_lay))))
(command "_.-wblock" (strcat (getvar "dwgname") "$" nam_lay) "" "*0.0,0.0,0.0" js "")
)
)
)
(prin1)
))

 

 

celui de fabcad :

 

(defun c:layers-to-wblocs (/ first unplan i lg-list-layers fichier js layer rep-cou lesplan)
(setvar "filedia" 0)
(setvar "cmddia" 0)
(setvar "cmdecho" 0)
(command "-calque" "ACtif" "*" "Libérer" "*" "Déverrouiller" "*" "")
(setq rep-cou (getvar "DWGPREFIX"))
(setq first T)
(while (setq unplan (tblnext "layer" first))
(setq first nil)
(setq lesplan (append lesplan (list (cdr (assoc 2 unplan)))))
);fin while
(setq lg-list-layers (length lesplan))
(setq i 0)
(while (< i lg-list-layers)
(setq layer (nth i lesplan))
(setq filtre (list (cons 8 layer)))
(setq js (ssget "X" filtre))
(setq fichier (strcat rep-cou layer))
(command "-wbloc" fichier "" "0,0" js "")
(setq i (+ i 1))
);fin while
(princ)
(setvar "filedia" 1)
(setvar "cmddia" 1)
(setvar "cmdecho" 1)
);fin defun

 

 

 

celui de toi gile :

 

(defun c:lay2wbl (/ echo lay_ss lay_name lay_lst ent_ss)
(setq echo (getvar "cmdecho"))
(setvar "cmdecho" 0)
(prompt "\nSelectionnez les calques.")
(setq lay_ss (ssget))
(repeat (setq ct (sslength lay_ss))
(setq lay_name
(cdr (assoc 8 (entget (ssname lay_ss (setq ct (1- ct))))))
)
(if (not (member lay_name lay_lst))
(setq lay_lst (cons lay_name lay_lst))
)
)
(mapcar
'(lambda (x)
(command "_.-layer" "_unlock" x "")
(cond
((setq ent_ss (ssget "_X" (list (cons 8 x))))
(if (not (findfile (strcat (getvar "dwgname") "$" x ".dwg")))
(command "_.-wblock"
(strcat (getvar "dwgname") "$" x)
""
"*0.0,0.0,0.0"
ent_ss
""
)
)
)
)
)
lay_lst
)
(setvar "cmdecho" echo)
(princ)
) 

 

 

merci à vous tous "gile,bonuscad,fabcad ..." et tous les membre de ce fabuleux forum qui nous donne vraiment un grand coup de main !!

 

Posté(e)

on fait j'ai tester le programme que tu m'as modifier et il me donne toutjour

(explodelayer commande inconnu !) je sais pas pourquoi ?

 

Moi non plus !

 

Chez moi çà marche.

 

Pour le code de bonuscad çà ne peut pas marcher si tu rajoutes (defun expl () au début du code.

 

C'est une fonction lambda (sans nom, voir explications plus haut) soit tu la copies telle quelle sur la ligne de commande soit tu la transforme en fonction defun, dans ce cas il faut mettre defun à la place de lambda au début du code, suivi de c:nom_de_la_fonction et il faut aussi supprimer une paranthèse ouvrante au début et une fermante à la fin.

 

EDIT : Je viens d'essayer tous les codes ils fonctionnent (à condition de supprimer (defun expl () au début du code de bonus)

 

Petite précision : si le début du code est (defun c:nom_de_la_fonction ... il faut taper nom_de_la_fonction

si c'est (defun nom_de_la_fonction ... il faut taper (nom_de_la_fonction)

 

[Edité le 25/4/2006 par (gile)]

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

Posté(e)

Salut

 

on fait j'ai tester le programme que tu m'as modifier et il me donne toutjour

(explodelayer commande inconnu !) je sais pas pourquoi ?

 

Tu charges bien le lisp ? Avec _appload, ou avec un (load"...."), ou en autoload, ou encore avec un drag&drop !

 

@+

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

Posté(e)

RE ,

 

je ne sais vraiment pas l'erreur que je fait pour que ça ne marche pas chez moi?? :casstet:

 

voilà ce que je fait :

 

1) prog :

 

j'ai remplacer lambda par defun

 

(defun c: eclatfol (/def_lay nam_lay js)

 

aprés je charge le programme par "appload", et je donne le nom de la fonction "eclatfol"

il me donne commande inconnu tapez f1......etc

 

2)&3)prog :

 

(defun c: layers-to-wblocs (/ first unplan i lg-list-layers fichier js layer rep-cou lesplan)

 

(defun c: lay2wbl (/ echo lay_ss lay_name lay_lst ent_ss)

 

 

je suit les mêmes démarche il me donne toujour que le nom de la fonction est inconnu !!! vraiment bizzzzzzaaar ! :casstet:

 

en fait j'ai l'autocad 2004 ça cause pas de problème... non ..??

 

je ne comprend pas !! :(

 

vraiment je suis désoler de vous dérranger avec moi !!

 

encors merci à vous !

 

 

 

 

Posté(e)

Re

 

Attention, il ne faut pas d'espace entre c: et eclatfol !

 

Quand tu fais _appload, as-tu bien Nom_de_fichier.lsp correctement chargé(s) en bas de la fenêtre ?

 

http://img288.imageshack.us/img288/129/laytest9zx.png

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

Posté(e)

 

Attention, il ne faut pas d'espace entre c: et eclatfol !

 

non j'ai vérifier j'ai pas d'espace !

Quand tu fais _appload, as-tu bien Nom_de_fichier.lsp correctement chargé(s) en bas de la fenêtre ?

 

oui il me met tout à fait en bas de la boite au dialogue "eclatfol.lsp correctement chargé(s"

 

 

bizzar bizzar !!!

 

 

 

Posté(e)

:) salut gile ,

 

oui j'ai plein d'autre fichier lisp, il y'a d'entre eux ceux que j'ai copier de cadxp,

ça marche trés bien !!

 

on fait gile, j'ai remarquée aujourd'hui ça :

 

quand j'ai charger mon fichier il m'a donné ceci :

 

 

(Defun c:ecl ( / def_lay nam_lay js) etc...

 

le message qui me sort dans ma ligne de commande quand je charge mon fichier c'est :

 

Commande: _appload eclatfol.lsp correctement chargé(s)

 

 

Commande: ; erreur: caractère lu incorrect (octal): 0

 

Commande:

 

c'est quoi cette erreur !!

ça me rend folle vraiment !!

 

 

 

 

Posté(e)

Salut,

 

Il y a peut-être une problème au moment du copier/coller, s'il manque la moindre paranthèse le LISP ne peut fonctionner.

 

Tupeux essayer ceci : copie le LISP, colle le dans un nouveau fichier de l'éditeur VisualLISP (menuOutils) et fait "Formater dans la fenêtre d'édition (image ici).

 

Si les paranthèses ne sont pas apariées tu auras un message d'erreur.

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

Posté(e)

salut gil !

 

je m'excuse je t'ai pas répondu ,mais vraiment j'avais un problème sur mon poste

plus problème de connéxion !

 

en fait pour le programme tu avais raison j'ai pas bien copie coller il me manquée une ) !

 

le programme qui a marché pour moi c'est :

 

(defun c:layers (/ first unplan i lg-list-layers fichier js layer rep-cou lesplan)
(setvar "filedia" 0)
(setvar "cmddia" 0)
(setvar "cmdecho" 0)
(command "-calque" "ACtif" "*" "Libérer" "*" "Déverrouiller" "*" "")
(setq rep-cou (getvar "DWGNAME"))
(substr rep-cou 1 9)
(setq first T)
(while (setq unplan (tblnext "layer" first))
(setq first nil)
(setq lesplan (append lesplan (list (cdr (assoc 2 unplan)))))
);fin while
(setq lg-list-layers (length lesplan))
(setq i 0)
(while (< i lg-list-layers)
(setq layer (nth i lesplan))
(setq filtre (list (cons 8 layer)))
(setq js (ssget "X" filtre))
(setq fich (substr rep-cou 1 9))
(setq fichier (strcat fich layer))
[u] ;;(command "-inserer" "*cart_AIC.dwg" "0,0" "" "")[/u]
;;(command "-inserer" "*cart_AIC.dwg" "0,0" "" "" "-wbloc" fichier "" "0,0" js "")
(setq i (+ i 1))
);fin while
(princ)
(setvar "filedia" 1)
(setvar "cmddia" 1)
(setvar "cmdecho" 1)
);fin defun

 

le seul souci que j'ai c'est que la cartouche il l'a prend comme un calque à part

alors que moi je veux que cette dernière apparait dans tous mes calque eclater en dwg

 

bon j'ai essayée avec une commande autocad ;;(command "-inserer" "*cart_AIC.dwg" "0,0" "" "")

mais....!

 

 

amicalement doua

 

 

 

 

 

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é