Aller au contenu

Projet d'étude :Calcul automatisé du poids d'aciers par éléments de structure


Messages recommandés

  • 1 mois après...
Posté(e)

Bonjour,

 

Je me rend compte d'un problème conséquent. Si l'utilisateur annule une commande en cours, l'accrochage aux objets reste en l'état (je le désactive pendant les commandes pour éviter tout accrochage auto) donc il reste désactivé. Comment puis je éviter cela?

 

Je me sers en début de commande de (setq osmode (getvar "OSMODE")) pour sauvegarder les accroches et en fin de commande(setvar "OSMODE" osmode) pour les remmettre. J'aimerai donc que même avec annulation de la commande par ECHAP, le programme se finisse correctement pour retrouver mes accrochages...

 

cordialement,

 

Arnaud

Posté(e)

j'ai déja vu notre grand (gile) faire ça...

je crois qu'il met un réacteur qui en cas d’annulation restaure les variables modifiées...

C'est pour la théorie, car pour la pratique je ne sais pas... mais cherche dans ce sens

 

jette un coup d’œil à ça

http://cadxp.com/topic/13164-reacteur-fin-de-commande/

 

ou peut etre un on_error?

 

perso, sur un de mes lisp j'ai ce genre de pb, mais n’étant pas pro lispeur, et surtout pas payer pour sortir de la programmation, (mon boss ferai la tronche si je torchais pas mes 10 projets par semaine :) ) ben j'ai fini par me faire un bouton avec mon OSMODE habituel et du coup quand je les ai perdu, je me les remet en 2/2.

Si tu est dans ta boite pour faire du développement je conçois que ce soit pas très pro...

Posté(e)

Merci beaucoup, j'ai trouvé mon bonheur avec les liens.

J'ai placé ceci en début de commande :

 

(defun *error* (msg)

(princ (strcat "\nErreur: " msg)) ; renvoie un msg d'erreur

(setvar "OSMODE" osmode) ; Restore les variables AutoCAD

(princ msg) ; Quitte silencieusement

)

 

Et avec ma sauvegarde des accrochages en début de programme et leurs restauration en fin de programme, tout marche.

 

Merci.

 

Nouveau point, j'ai une commande permettant de récupérer la valeur d'un texte ( Exemple : 15.50 Kg je récupére le 15.50 et le transforme en réel). J'en sélectionne plusieurs puis le programme fait l'addition et à la fin insère la somme.

 

Je souhaite améliorer la sélection des textes car actuellement l'utilisateur doit cliquer le texte puis renseigner "oui" pour pourvoir en sélectionner un autre,etc... et quand on à tous sélectionner répondre "non" pour quitter la boucle.

 

Je voudrai que l'utilisateur clique toutes les valeurs qu'ils souhaitent additionner et en validant par entrée finir la commande pour insérer la somme.

 

Le code:

 

 

(defun c:somme1()

 

(vl-load-com)

 

(defun *error* (msg)

(princ (strcat "\nErreur: " msg)) ; renvoie un msg d'erreur

(setvar "OSMODE" osmode) ; Restore les variables AutoCAD

(princ msg) ; Quitte silencieusement

)

 

(setq osmode (getvar "OSMODE"))

 

 

(setvar "OSMODE" 0)

 

;Style et forme

(command "-calque" "ch" "02-NOMENCLATURE" "")

(command "-couleur" "93" "")

(command "textstyle" "ITALIC" "")

 

 

 

;Appel de la fonction dimensions

(Dimensions)

 

;Définition des variables à 0

(setq Total 0)

(setq nombre_tour 0)

(setq Tot 0)

 

;Début de la boucle

(terpri)(setq rep "O")

 

(while (or (= rep "O")(= rep "OUI"))

 

 

(while

;Sélection du poids d'aciers

(null (setq NomEntité (car (entsel "\nSélectionnez le poids d'acier")))))

 

(setq poids (atof (cdr (assoc 1 (entget NomEntité)))));Converti texte du poids en valeur

(setq listeee (entget NomEntité)) ;Récupére la liste des variables du texte

(setq X (car(cdr (assoc 11 listeee)))) ;Récupère la valeur d'implantation en X

(setq Y (car(cdr(cdr (assoc 11 listeee)))));Récupère la valeur d'implantation en Y

 

 

(setq Total (+ Total poids));Aditionne les poids selectionné

(setq nombre_tour (+ nombre_tour 1 ));Compteur pour le nombre de tour

(setq Tot (+ Tot Y)) ;Additionne les valeur d'implantation des poids en Y

 

;SI oui = on reselectionne un poids si Non=somme du regroupement fini

(setq rep (strcase(getstring "\nVoulez continuer (o/n): ")))

 

)

 

 

;On trouve le milieu des lignes pour l'implantation de la somme

(setq Ymilieu (/ Tot nombre_tour))

 

;On décale pour se mettre dans la colonne somme et obtenir le point d'implantation centré

(setq Xnouveau (- X 30))

 

;Point d'implantation de la somme

(setq p (list Xnouveau Ymilieu))

 

;Vérifie si le terme "ml" est présent dans le texte

(setq pos (vl-string-search "ml" (cdr (assoc 1 (entget NomEntité)))))

 

(cond

((= pos 7) ;Si il renvoie 7, "ml" se situe à la 7ème position de la chaine de caractère

(setq U "kg/ml")); C'est donc une somme en "kg/ml"

 

((= pos nil); Si il renvoie nil, cela veut dire que "ml" n'est pas présent

(setq U "kg"));C'est donc une somme en "kg"

)

 

;Ecriture de la somme sur 2 lignes

(command "texte" "j" "mc" (polar p (/ pi 2) 5) 5 0 (strcat (rtos Total 2 1 )))

(command "texte" "j" "mc" (polar p (/ pi -2) 5) 5 0 U)

 

 

(princ)

 

(setvar "OSMODE" osmode)

 

 

)

 

[code]

 

 

J'espère que j'ai était comprehensible, grosso modo je souhaite enlever la ligne du code suivante :

[code]

 

;SI oui = on reselectionne un poids si Non=somme du regroupement fini

(setq rep (strcase(getstring "\nVoulez continuer (o/n): ")))

 

[code]

 

 

Merci d'avance

Posté(e)

Bonjour Arnaud,

 

Merci beaucoup, j'ai trouvé mon bonheur avec les liens.

J'en suis heureux

 

Nouveau point, j'ai une commande permettant de récupérer la valeur d'un texte ( Exemple : 15.50 Kg je récupére le 15.50 et le transforme en réel). J'en sélectionne plusieurs puis le programme fait l'addition et à la fin insère la somme.

 

Je souhaite améliorer la sélection des textes car actuellement l'utilisateur doit cliquer le texte puis renseigner "oui" pour pourvoir en sélectionner un autre,etc... et quand on à tous sélectionner répondre "non" pour quitter la boucle.

 

Je voudrai que l'utilisateur clique toutes les valeurs qu'ils souhaitent additionner et en validant par entrée finir la commande pour insérer la somme.

Le mieux je pense et de faire un jeu de sélection avec ssget puis de le traiter, pour l'utilisateur il sera dans un système de sélection classique (possibilité d'ajout ou de suppression d'entité à la sélection) avec filtrage des entités texte..

 

Je te donne en exemple de quelques lignes à tester et décortiquer pour l'addition de tes poids ,traitement du code dxf 1 le principe est le même pour les autres codes dxf (fonctionne seulement sur des textes simples).

 

;; Création d'un jeu de sélection ->sélection des entitées textes 
(setq poids 0
     ss    (ssget '((0 . "TEXT")))
)

;; traitement du jeu de sélection et addition des codes dxf1
(repeat (setq i (sslength ss))
 (setq poids (+ poids (atof (cdr (assoc 1 (entget (ssname ss (setq i (1- i)))))))))
)

 

A+

Apprendre => Prendre => Rendre

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é