Aller au contenu

demande de correction d\'un programme


Messages recommandés

Posté(e)

salut

 

j'ai fait un programme pour avoir un liste de materiel, alors

les problèmes que j'ai rencontrés sont :

 

1) quand jel'exécute il me donne une erreur j'ignore pourquoi?? "

 

Commande: _appload nommat.LSP correctement chargé(s)

Commande: nmat

25; erreur: type d'argument incorrect: lselsetp nil

 

voilà mon prog:

 

je travail avec des calques, et mes équipement sont fait en wbloc avec attribut.

 

 

(defun c:nmat (/ tmp II) 

;recherche de tous des calques
 
 (setq tmp (tblnext "LAYER" t))
 (setq ll ())
(setq paire ())
 (setq listenom ())
; renvoie de toute la liste des calques vers nomcalq
 (setq nomcalq (cdr (assoc 2 tmp)))
 
;remplir une condition 
 (if (and (= (substr nomcalq 1 1) "0") (= (testnom nomcalq) "numerique") (/= nomcalq "0") (/= nomcalq "000"))

;si ok affecter la liste à ll

   	(setq ll (list nomcalq))
  )    
;faire ce traitement en boucle
 
 (while (setq tmp (tblnext "LAYER"))
   
    	(setq nomcalq (cdr (assoc 2 tmp)))

 	(if (and (= (substr nomcalq 1 1) "0") (= (testnom nomcalq) "numerique") (/= nomcalq "0") (/= nomcalq "000"))
 
	(setq ll (cons nomcalq ll))
 
  )
   )
;(princ ll)
 
 ;nombre de calque trouver
 (setq ncalq (length ll))
 
(princ ncalq)
 
 (setq compt 0)

 (repeat ncalq
   
; affectation du n ème élement de la liste ll vers ncalque 
   (setq ncalque (nth compt ll))	
   
   	    
; traitement d'attribut
   
   (setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 "Lis*")(cons 8 ncalque))))
  ;(princ jeu)
   (setq nbc (sslength jeu ))
   ;(princ nbc)
 
   	(setq compte 0)
(repeat nbc
;(princ nbc)
   (setq bl (ssname jeu compte))
     ;(princ bl)

  		(setq att (entnext bl))

	(setq cle_0 (cdr (assoc 0 (entget att))))

;exécuter ce traitement tant que cle_0 n'a pas atteint le dernier attrib
  
	(while (/= cle_0 "SEQEND")

	  	(setq cle_1  (assoc 1 (entget att)))
	  	(setq cle_2  (assoc 2 (entget att)))
	  		   
		  (if (= (cdr cle_2) "NOM")
		  
	  		(progn		  
				(setq nomequip (cdr cle_1))
			  )
		    )
	  
		  (if (= (cdr cle_2) "DES")
		  
	  		(progn		  
				(setq design_equip (cdr cle_1))
			  )
		    )					 	 	  	  
	  	(setq att (entnext att))
		(setq cle_0 (cdr (assoc 0 (entget att))))
	  )		  
(setq compte (+ 1 compte))
   (princ design_equip)      
   )  
(setq paire ())
	(setq paire (list nomequip design_equip))  
  	(setq listenom (cons paire listenom))
    	(setq compt (+ 1 compt))    
)
(setq nblistenom (length listenom))

(setq i 0)
 	(setq listfol ())
 
(repeat nblistenom

(setq text1 (car(nth i listenom)))    	 	
(setq listfol (cons text1 listfol))
 	(setq i (+ 1 i))   
 )
 
; trier dans l'ordre alphabétique une liste de chaine
 
(setq listfol (acad_strlsort listfol))
;;*****************************************

 	(setq i 0)
	(setq listenomtr ())
	(repeat nblistenom

	(setq nommat (nth i listfol))

       	(setq titre (cadr (assoc nommat listenom)))

  	(setq paire ())
       	(setq paire (list nommat titre))
       	(setq listenomtr (cons paire listenomtr))

 		(setq i (+ 1 i))     
    )

;  renoie de la liste avec ces elements inversés
 
(setq listenom (reverse listenomtr))
 
;;******************************************

 ; pour activer un calque spécifier
 
(setq clq_anc (getvar "CLAYER"))
 (if (/= clq_anc "023")
   (progn
       (command '"calque" "L" "023" "")
(setvar "CLAYER" "023")
(command '"calque" "G" clq_anc "")
   )    
 )
;;******************************************

; pour ecrire dans une coordonée en l'incrémentant 
 
(setq i 0)
(repeat nblistenom

(setq text1 (car(nth i listenom)))
   	(setq text2 (cadr(nth i listenom)))
 
 	(setq xif 29.8729)
 	(setq xit 85.0348)
 	(setq yif (- 261.8074 (* 4.9 i)))  	
 	(setq yit (- 261.8074 (* 4.9 i)))
	(setq ptif (list xif yif))
 	(setq ptit (list xit yit))

	; pour désactiver l'accrochage objet

 	(setvar "CMDECHO" 0)
(setq osmode_anc (getvar "OSMODE"))
(setvar "OSMODE" 0)
 	 
(command "_text" ptif "" "" text1 )
    	(command "_text" ptit "" "" text2 )

; pour activer l'accrochage objet
 
 	(setvar "OSMODE" osmode_anc)
	(setvar "CMDECHO" 1)
	(setq i (+ 1 i))
)
 
(command "_regen")
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun testnom (nomc)

 (setq test "numerique")
 (setq i 1)
 (setq longnom (strlen nomc))
 (repeat longnom
(setq caract (substr nomc i 1))
   	(if (and (/= caract "0") (/= caract "1") (/= caract "2") (/= caract "3") (/= caract "4") (/= caract "5") (/= caract "6") (/= caract "7") (/= caract "8") (/= caract "9"))
	(setq test "non numerique")
  )
(setq i (+ i 1))    
 ) 
test  
)

 

 

merci pour votre aide

 

Posté(e)

L'inconvenient de ton code, est qu'il est écrit pour un environnement bien précis (calques, blocs etc..), donc difficile à tester si l'on est pas exactement dans les mêmes conditions.

 

Cependant

; erreur:type d'argument incorrect: lselsetp nil
provient certainement de la ligne: (setq nbc (sslength jeu ))

En effet on ne peut obtenir la longueur d'une sélection vide, tu dois d'abords t'assurrer que le jeux de sélection est valide avant de demander le nombre d'éléments qu'il contient.

 

Voilà pour le message d'erreur lselset qu'on peut interpréter comme suit "l"= length (longueur)

"sel" = select (sélection) "set"=set (déclaration)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

merci bonuscad, pour ton aide et aussi l'explication de l'erreur, maintenant je comprend ça signification merci encors !

 

je vais vérifier mnt et te tiendrai au courant !!

 

doua

 

 

Posté(e)

RE ,

 

j'ai tester le programme et ça marche toujour pas !

 

je crois lorsque je lui donne le nom des attributs qui commence par "List*" il la reconnaît pas

 

car j'ai vu dans un livre de programmation quand on fait comme ça :

 

(setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 "List*")(cons 8 ncalque))))

 

il va chercher tout les attributs qui commence par "List*"

 

enfin je ne comprend vraiment pas !??

 

si vous avez une idée !!

 

merci de votre aide !!

 

doua

amicalement

Posté(e)

Impossible.Il faut balayer tes entités à l'intérieur du bloc

 

Tentes plutot :

 

 


(setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 "CARTOUCHE*"))))
(setq entite (ssname jeu 5)listatt nil)
(while
 (setq entite   (entnext entite))
 (if  (=  (CDR (assoc 0 (entget entite))) "ATTRIB")
   (setq contenu(entget entite)listatt(append listatt(list(list(cdr(assoc 2 contenu))(cdr(assoc 1 contenu))))))))

listatt

 

Attention, j'ai mis CARTOUCHE*

 

En francais :

Tant que des entités suivent je regarde si ces entités sont des attrib, et j'ajoute alors à la liste la paire de l'ASSOC 2 et 1 qui donnent le nom de l'attrib et sa valeur.

 

[Edité le 12/5/2006 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

:) bonjour Tramber,

 

je te remercie pour ton interêt à mon problème !

 

en fait ce week-end j'ai pas travailler sur ce sujet , mais je vais tester aujourd'hui ça et je te tiendrai au courant ! ;)

 

merci encors pour vous tous membres de ce super forum !!

 

doua amicalement

 

Posté(e)

salut tramber,

j'ai tester ton programme il me donne comme ceci :

 

 

mat

((NOM V24) (DES Diodes 24VAC) (NOM HL25) (DES Voyant jaune + lampe 24VAC -50Hz)

(X1 X1) (X2 X2) (NOM V25) (DES Diodes 24VAC) (NOM HL21) (DES Voyant vert +

lampe 24VAC -50Hz) (X1 X1) (X2 X2) (NOM 1SB1D) (AMP ) (DES Boutton poussoir à

fermeture - couleur Noir) (- ) (- ) (NOM 1SB2D) (AMP ) (DES Boutton poussoir

à fermeture - couleur Noir) (- ) (- ) (NOM 2SB2B) (AMP ) (DES ) (- ) (- )

(NOM 2SB1B) (AMP ) (DES ) (- ) (- ) (NOM 1SB2A) (AMP ) (DES ) (- ) (- )

(NOM 1SB1A) (AMP ) (DES ) (- ) (- ) (NOM 1SB3A) (AMP ) (DES ) (- ) (- )

(NOM 2SB3B) (AR ) (- ) (- ) (NOM V23) (NOM V24) (NOM V25) (NOM V26) (NOM

V27) (NOM V28) (NOM HL23) (B1 X1) (B2 X2) (NOM HL24) (B1 X1) (B2 X2)

 

mais on faite moi il faut q'il me traite calque par calque

 

pour qu'on fin de compte je me trouve avec :

 

un tableau nomenclature de materiel par exemple :

 

folio item designation

 

004 Q1 DISJONCTEUR (2x10A)

004 Q2 DISJONCTEUR (2x20A)

005 Q10 DISJONCTEUR (4x4A)

etc....

 

 

 

on fait j'avais déja fait un programme pour la nomenclature des folios

et ça marche bien j'ai pris ce dernier et j'ai modifier les étiquettes d'attribut à rechercher ça marche mais si je traite un calque bien spécifier exemple :

(setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 "List*")(cons 8 "004"))))

 

 

mais si je lui donne la variable (ncalque)

(setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 "List*")(cons 8 ncalque))))

 

ça marche pas !!

 

dites moi svp si je veux ajouter une autre recherche d'etiqutte d'attribut ,

est_ce q'il faut faire comme ça ou non car ça ce bloque aussi à ce niveau .

(setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 or "List*" "fol"))(cons 8 ncalque))))

 

 

merci infinnement pour votre aide précieuse!

 

Posté(e)

Tu veux pas mettre ton DWG à dispo pour simplifier un peu notre aide.

 

http://www.megaupload.com/fr/

ou un autre.

 

ton coup de la variable, ca peut marcher.

 

Après il faut parcourir ton jeu.

 

Dans mon code, il a un piège :

(setq entite (ssname jeu 5)listatt nil)

 

Je parcours l'entité 6 (1+5) du jeu, il faut boucler.

 

JE vais regarder un peu ton code du début en attendant.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Bonjour Tramber,

 

on fait je connait pas la procedure pour envoyer un fichier sur cadxp !

peut tu m'expliquer stp.

ou bien si tu peux me donné un adresse e-mail !

 

merci encors

 

doua

 

 

 

 

 

 

Posté(e)

Bonsoir Tramber,

 

je t'ai envoyé le fichier dans cette adresse :

 

ab-cad@wanadoo.fr

 

j'espère que je me suis pas tromper ! :exclam:

 

merci pour ton aide précieuse !

 

doua

 

Posté(e)
(setq jeu (ssget "x" (list (cons 0 "insert")(cons 2 "List*")(cons 8 ncalque))))

il va chercher tout les attributs qui commence par "List*"

Non, la sélection va se faire sur tous les blocs dont le nom commence par "List*"

Si tu cherches les attributs ayant comme Etiquette "List*", il faut balayer la table des blocs pour retrouver le nom des blocs ou on peut retrouver "List*" et ensuite faire un jeu de sélection dans le dessin de ces blocs que l'on re-balaye pour faire ce que tu désires

A te lire, je ne saisi pas tout. Peut tu redonner une explication plus clair de ce que tu souhaites faire exactement :casstet:

 

@+

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)

desoler , je me suis pas connecter hier pour te répondre !

 

Si tu cherches les attributs ayant comme Etiquette "List*", il faut balayer la table des blocs pour retrouver le nom des blocs ou on peut retrouver "List*" et ensuite faire un jeu de sélection dans le dessin de ces blocs que l'on re-balaye pour faire ce que tu désires

on fait oui je cherche des attributs qui portes une étiquette qui commence par "list*"

 

tu sais comme je l'avais déja ecris dans mon message ( posté le 15/5/2006 à 18:47)

 

ilme manque juste qlq chose dans mon programme que je ne sais pas

 

dit patrik tu peux me donnée un adresse e-mail et je t'envoi le programme plus le fichier

là je crois tu pourra comprendre ce que je veux

 

stp Patrick,

 

merci

 

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é