Aller au contenu

Messages recommandés

Posté(e)

 

nouveau sujet nouvelle question:

 

mon probleme:

j'ai deux liste, exemple

 

L1 : (1 3 5 7 9)

L2 : (2 4 6 8 10)

 

bon et ben vus que je suis un peut chiant je veut sa:

(1 2 3 4 5 6 7 8 9 10)

 

j'ai codé une tite fonction

(defun c:INT_list ( l1 l2) ; intercaleur de liste

(setq liste_in nil)
 	(while l1
  	(setq Liste_in  (cons  (cons (car l1) (car l2))       Liste_in))
  	(setq l1 (cdr l1))
	(setq l2 (cdr l2))

  )
 (reverse Liste_in)
		 
 )

 

mais sa me donne

((1 2) (3 4) (5 6) (7 8) (9 10))...

Et le problème c'est que derrière j'ai une autre fonction qui n'accepte que des chaine continue..

 

donc si quelqu'un connais le moyen de transformé

((1 2) (3 4) (5 6) (7 8) (9 10))

en

(1 2 3 4 5 6 7 8 9 10)

 

je suis tout ouïe

Posté(e)

Salut,

 

Pour "aplatir" ta liste, tu peux faire :

(apply 'append '((1 2) (3 4) (5 6) (7 8) (9 10)))

 

Mai il y a moyen de faire plus simple (et plus élégant) :

(defun int_list (l1 l2)
 (if l1
   (cons (car l1) (int_list l2 (cdr l1)))
   l2
 )
)

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

Posté(e)

Salut

 

Ou encore

(vl-sort (append '(1 3 5 7 9) '(2 4 6 8 10)) '<[b])[/b]

mais j'ai l'impression de tricher un peu ;)

 

Sinon, il y a aussi cette solution

(apply 'append (mapcar 'list '(1 3 5 7 9) '(2 4 6 8 10)))

 

@+

 

[Edité le 27/4/2011 par Patrick_35]

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)

Bonsoir!

 

merci beaucoup pour ces information!

Cependant il semble que j'ai oublier de précisé un objet non négligeable:

le contenue de mes liste, c'est du texte

exemple réel :

L1 : ("Enrobé " "TV 0-20" "TV 0-31,5" "Traitement en place")

L2 : ("0,1" "0,2" "0,35" "0,65")

 

 

forme de la liste obtenue avec mon code :

(("Traitement en place" . "0,65") ("TV 0-31,5" . "0,35") ("TV 0-20" . "0,2") ("Enrobé " . "0,1"))

 

or la fonction append ne fait rien, (je n'ai pas de message d'erreur mais aucun resultat).

 

donc a priori je tourne toujours en rond^^.

 

ceci dit sa sert a quoi tout vos apostrophe? c'est pour déclaré un paramètre ou c'est plus complexe?

 

ps: j'ai aussi essayer sans succé les autre proposition

 

[Edité le 27/4/2011 par harksin]

Posté(e)

C'est parce que ton code ne génère pas une liste de sous listes, mais une liste de paires pointées.

 

Les codes données par Patrick_35 et moi fonctionnent tous les deux. Une petite différence si les deux listes ne font pas la même longueur : le code donné par Patrick_35 s'arrête à la liste la plus courte, celui que j'ai donné ajoute le restant de la liste la plus longue.

 

(setq L1 '("Enrobé " "TV 0-20" "TV 0-31,5" "Traitement en place")
     L2 '("0,1" "0,2" "0,35" "0,65")
)

(defun int_list (l1 l2)
 (if l1
   (cons (car l1) (int_list l2 (cdr l1)))
   l2
 )
)

(defun int-list	(l1 l2)
 (apply 'append (mapcar 'list l1 l2))
)

 

_$ (int_list l1 l2)

("Enrobé " "0,1" "TV 0-20" "0,2" "TV 0-31,5" "0,35" "Traitement en place" "0,65")

_$ (int-list l1 l2)

("Enrobé " "0,1" "TV 0-20" "0,2" "TV 0-31,5" "0,35" "Traitement en place" "0,65")

 

 

ceci dit sa sert a quoi tout vos apostrophe?

L'apostrophe est un raccourci pour la fonction quote qui empêche l'évaluation de l'expression.

Ceci dit, si tu poses ce genre de questions, c'est que tu t'es trompé de forum, "Débuter en LISP" aurait été mieux adapté et les réponses auraient peut-être pris ça en considération.

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

Posté(e)

Effectivement sa marche

 

Pourquoi je n'ai pas réussi tout a l'heure? mystère.

 

Pour le post je ferai attention a poser au bon endroits la prochaine fois.

 

Cependant si sa ne t'embette pas on peut continuer ici?

pourrai tu m'expliquer ce qu'est une paire pointé?? comme on les obtiens et quel sont leur usage?

 

parcque pour le coup je n'ai jamais entendu ce mot dans la bouche de mon prof^^.

 

 

par ailleur je me casse les dent sur un algorithme de désision.

 

ma structure est:

tan que ma liste existe

Si son premier element est égal a (une serie de possibilité)

 

alors

si je rencontre (une serie de possibilité)

j'enregistre les valeur suivante dans une liste et je lance un cript

 

sinon je reduit la liste d'un element (et j'ajoute la valeur suprimé a une liste temporaire)

et je recomence.

 

 

ma question est:

quand je sort du cript je veut retourné au debut de l'algo, et non pas a un endroit X a l'interieur... auriez vous une piste pour mois?

 

la premiere branche de l'arbre de dessision :

 

 

(setq len_disp (length Disp_lst))

(while (< 0 len_disp)

 (cond
   ((= "Vo_def" (Car Disp_lst))
    (
     (repeat (cond
	((= "Vo_def" (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo)))
      )				;rend la liste active courante et lance le prog
((= "Tr_def" (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo)))
     )
      ((= "Brd_def" (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo)))
    )
    ((= nil (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo)))
   )
   ((setq disp_lst_act (cons (Car Disp_lst) disp_lst_vo)) (setq Disp_lst (cdr Disp_lst)))
 )

)

[Edité le 27/4/2011 par harksin]

Posté(e)

pourrai tu m'expliquer ce qu'est une paire pointé?? comme on les obtiens et quel sont leur usage?

 

parcque pour le coup je n'ai jamais entendu ce mot dans la bouche de mon prof^^.

 

J'espère que tu as eu un moment d’inattention, parce que sinon,ton "prof" a vraiment oublié de te parler des fondamentaux...

 

Un paire pointée est une liste spéciale, non seulement parce qu'elle ne contient que deux éléments mais surtout à cause de la manière dont on la construit et dont on accède à ses éléments.

Une paire pointée se construit avec la fonction cons à laquelle on passe deux atomes comme arguments :

(setq p (cons 1 "a")) retourne (1 . "a") qui est une paire pointée (il y a un point entre les deux éléments)

(car p) retourne 1 comme avec une liste classique, mais

(cdr p) retourne "a" qui n'est pas une liste mais un atome

 

Avec une liste classique de deux éléments, on a des résultats un peu différents.

Pour la construire, on utilise la fonction list :

(setq l (list 1 "a")) retourne (1 "a") qui est une liste classique (pas de point)

(car l) retourne 1, mais

(cdr l) retourne ("a") qui est une liste.

 

Ce comportement est directement lié aux "listes chainées" utilisées en LISP (et dans d'autres langages). Voir ce sujet.

 

Les paires pointées sont largement utilisées dans ce qu'on appelle les listes d'association : liste de paires pointées et/ou de sous listes dont le premier élément sert de clé et le reste de la sous-liste (ou paire pointée) est la valeur.

Les données DXF des objets AutoCAD (entre autres) sont exposés de cette manière ce qui facilite l'accès à ces données avec la fonction assoc et les clés.

Exemple avec une liste d'association très simple :

(setq alst '((1 . "string") (10 2.6 8.4 0.0) (70 . 2)))

(assoc 1 alst) retourne la paire pointée (1 . "string")

(assoc 10 alst) retourne la liste (10 2.6 8.4 0.0)

(assoc 70 alst) retourne la paire pointée (70 . 2)

 

et la fonction cdr permet d'accéder à la valeur que celle-ci soit un atome ou une liste

(cdr (assoc 1 alst)) retourne l'atome "string"

(cdr(assoc 10 alst)) retourne la liste (2.6 8.4 0.0) (un point)

(cdr(assoc 70 alst)) retourne l'atome 2

 

Quand à ta seconde demande, je ne comprends pas tout mais peut te dire d'ores et déjà que ton code comporte beaucoup trop de parenthèses.

(cond
 ([i]condition1 expression1 expression2[/i] ...)
 ([i]condition2 expression4 expression5[/i] ...)
 ...
)

Où chaque condition et expression peut être soit un atome soit une liste (appel de fonction).

Je te recommandes la lecture des 4 sujets "Mis en tête" du forum "Débuter en LISP" :

- Éléments de syntaxe AutoLISP

- L'éditeur Visual LISP

- Arguments et Variables

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

Posté(e)

Je publie a la suite car je suis dans l'impossibilité de crée un nouveau sujet (dans le forum debutant ou ici) (erreur duplicate key)

 

merci pour toute tes info j'ai encore du mal a saisir la difference entre argument et variable locale mais je vais trouvez!

 

En fait si tu veut je souhaite sortir d'une boucle avant qu'elle soit fini, car ma boucle est une fonction de recherche, et quand j'ai trouvé je ne doit pas continuer...

 

 

message original:

bonjour

 

Voila, je voudrai ouvrir un nouveau .dwg a partir d'un gabarit.

Le but étant que mon lisp ouvre ce gabarit, enregistre le fichier, dessin dedans, puis le ferme

 

le tout uniquemet en ligne de commande pour que ce soit transparent pour l'utilisateur. la question est donc commen faire pour ouvrir et fermer un fichier??

 

merci d'avance de votre aide

 

Harksin

 

[Edité le 28/4/2011 par harksin]

Posté(e)

j'ai encore du mal a saisir la difference entre argument et variable locale

 

On appelle variable une valeur affectée à un symbole, dans le dessin ou à l'intérieur d'une fonction si la variable est déclarée dans la fonction.

 

Un argument (ou paramètre) est une valeur passée à une fonction, quand on fait :

(reverse Liste_in) Liste_in est l'argument de la fonction reverse.

 

(defun c:INT_list ( l1 l2) ...) l1 et l2 sont les arguments de la fonction c:int_list.

 

En fait si tu veut je souhaite sortir d'une boucle avant qu'elle soit fini, car ma boucle est une fonction de recherche, et quand j'ai trouvé je ne doit pas continuer...

 

La fonction cond évalue tour à tour les conditions jusqu'à la première qui retourne un résultat non nil, elle évalue alors la ou les expressions pour cette condition puis s'arrête.

 

(setq num (getint "\nEntrez un nombre entier: "))
(cond
 ((= 0 (rem num 2)) (alert "Nombre pair"))
 ((= 0 (rem num 3)) (alert "Multiple de 3"))
 (T (alert "Nombre impair non multiple de 3"))
)

 

Voila, je voudrai ouvrir un nouveau .dwg a partir d'un gabarit.

Le but étant que mon lisp ouvre ce gabarit, enregistre le fichier, dessin dedans, puis le ferme

 

le tout uniquemet en ligne de commande pour que ce soit transparent pour l'utilisateur. la question est donc commen faire pour ouvrir et fermer un fichier??

 

Attention le LISP est lié au document : si un LISP lancé dans un document "A" ouvre un document "B", il n'est pas actif dans le document "B".

En Visual LISP, on peut utiliser ObjectDBX pour accéder à la base de donnée d'un document fermé, modifier cette base de donnée et enregistrer le document, mais je pense que tu as des choses à apprendre avant de te lancer dans ce genre d'exercice.

 

Sinon, ce que tu veux faire est peut-être possible en utilisant un script, fais une recherche avec SuperAutoScript.

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

Posté(e)

Bonjour,

 

Voila, je voudrai ouvrir un nouveau .dwg a partir d'un gabarit.

Le but étant que mon lisp ouvre ce gabarit, enregistre le fichier, dessin dedans, puis le ferme.

 

C'est absolument incompréhensible (pour moi en tout cas)... :casstet:

Il n'est pas nécessaire d'ouvrir un gabarit pour créer un nouveau fichier à partir d'un gabarit, pourrais-tu essayer de clarifier ce que tu souhaites faire ?

Posté(e)

bonjour

 

en fait je veut pouvoir dire en lisp

 

crée ce fichier, pour ce faire utilise le gabarit "X"

place toi dedans

dessine

sauve

ferme

 

 

j'ai trouvé une manière de contourné mon problème en dessinant dans le dessin actif dans une zone défini, et en exportant le contenue de cette zone dans un nouveau dwg avec la commande wbloc

 

mais je suis toujours en quette d'un moyen plus direct

 

pour résumé je cherche des équivalent au jeux de commande lisp (open read-line write-line close)

mais qui s'applique à un dessin et non à un fichier texte.

 

 

ceci-dit je pense que gile avais cerné la question, et je après avoir fouillez un peut je pense qu'il a raison. pour superautoscrip je l'ai Dl mais pas encore etudié.

 

petite question subsidiaire:

quand on crée un wbloc depuis un script les objet sélectionné s'efface, hors dans la boite de dialogues il y a un option "conserver". peut on contrôler cet argument ?

 

bonne journée

 

harksin

 

[Edité le 29/4/2011 par harksin]

Posté(e)

Salut

 

Je pense comme (gile)

Apprends à mieux utiliser le vlisp avant de t'attaquer à ce type de prog.

Il y a plusieurs concepts à maîtriser, comme la gestion des documents dans autocad par exemple.

 

@+

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)

bonsoir quelqu'un sait il pourquoi je ne peut plus crée de sujet (erreur duplicate key 1)

en désespoir de cause je poste ici mais c'était pour le forum "object dcl"

 

 

message original

Bonjour

 

je souhaite afficher un dwg dans une boite de dialoge

 

dwg preview d'objectdcl me parai approprié

 

néanmoins je ne parviens pas a réglé le zoom et la position de la vue.

 

connaissait vous une méthode ou un autre artefact qui me permette d'arriver plus facilement a mes fins??

 

merci d'avance pour vos réponse

 

Harksin

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é