Invité pleche.damien Posté(e) le 20 juillet 2011 Posté(e) le 20 juillet 2011 Bonjour j'aimerai améliorer un petit programme lisp, qui m'insère un cercle à un interval donné mais malheuresement il me l'insert à la fin du premier espacement se que je ne veux pas faire car je veux l'inserer au début du point "ptac3" et a la fin "ptac4" avec des espacements constants Par exemple: si je veux insérer 5 cercles sur 1 m de long entre le point ptac3 et ptac4 le premier acier insérer sera à 0 m ; le deuxième à 0.25m; 3 éme à 0.5m;4 ème à 0.75m 5 ème cercle à 1m.Se qui me donne donc 5 cercles insérés tout les 0.25m alors que pour l'instant mon programme donne bien 5 cercles mais insérer tout les 0.16 m.Le 1er à 0.16m; 2ème à 0.32m .... Dernier à 0.84 mIl y as donc un problème d'espacement et d'emplacement du premier acier de départ Je vous mes donc mon lisp si vous voulez y apporter toutes modifications MERCI (defun c:acier15 () (setq ptac3 (getpoint "/n donner le premier point")) (setq ptac4 (getpoint ptac3 "/n donner le deuxieme point")) (setq nbr11 (getint "/n donner nombre acier")) (setq d1 (/ (distance ptac3 ptac4) (1+ nbr11))) (setq dist d1) (setq ang (angle ptac3 ptac4)) (repeat nbr11 (command "_.insert" "cercle" "_none" (polar ptac3 ang dist) "1" "1" (* (/ ang pi) 180.0) ) (setq dist (+ dist d1)) ))
VDH-Bruno Posté(e) le 20 juillet 2011 Posté(e) le 20 juillet 2011 Bonsoir, Tu y étais presque… remplace les lignes suivante: (setq d1 (/ (distance ptac3 ptac4) (1+ nbr11))) (setq dist d1)Par (setq d1 (/ (distance ptac3 ptac4) (1- nbr11))) (setq dist 0) Sinon pour ce qui est d’ordre plus général tu peux regrouper tes appels à setq en un seul : (setq ptac3 (getpoint "\n Point de départ: ") ptac4 (getpoint pt1 "\n Point de fin: ") nbr (getint "\n Nombre d'aciers à inserer: ") d1 (/ (distance ptac3 ptac4) (1- nbr11)) dist 0 ang (angle ptac3 ptac4) ) Il est possible de déclarer ses variables en local de la façon suivante : (defun c:acier15 (/ ptac3 ptac4 nbr11 d1 dist ang) Et enfin tu peux également gérer l’état de la variable CMDECHO depuis ton Lisp avec les fonctions getvar & setvar tu verra ça fait plus propre sur la ligne de commande AutoCAD, dans la même veine pense également insérer un (princ) en fin de programme cela évitera de retourner la dernière valeur calculé par ta fonction sur la ligne de commande. (Ps : Pour le saut de ligne dans tes invites c’est \n ;) ) A+ [Edité le 20/7/2011 par VDH-Bruno] Apprendre => Prendre => Rendre
Invité pleche.damien Posté(e) le 20 juillet 2011 Posté(e) le 20 juillet 2011 MERCI BRUNO sa marche trés bien, et comme je vois que tu doit bien te débrouiller en lispj'aimerais faire la même chose avec la command DIVISER mais cette fois si je n'insère pas de bloc (defun c:acier16 () (setq ptac3 (getpoint "/n donner le premier point")) (setq ptac4 (getpoint "/n donner le deuxieme point")) (command "ligne" ptac3 ptac4 nil) ;(setq lin (list '(0 . "line") '(8 . "0") ptac3 ptac4)) (setq d1 (entlast)) (setq nbr11 (getint "/n donner nombre acier")) (setq D2 (getint "/n donner le diamètre acier")) (command "diviser" d1 "B" "cercle" "O" nbr11) (entdel d1) ) sauf que la sa m'insère 4 aciers au lieux de 5 et le premier attaque toujours à la fin du premier espacement Merci pour vos réponse
Invité pleche.damien Posté(e) le 20 juillet 2011 Posté(e) le 20 juillet 2011 bon bin je viens de trouver avec la command diviser: (defun c:acier16 () (setq ptac3 (getpoint "/n donner le premier point")) (setq ptac4 (getpoint "/n donner le deuxieme point")) (command "ligne" ptac3 ptac4 nil) ;(setq lin (list '(0 . "line") '(8 . "0") ptac3 ptac4)) (setq d1 (entlast)) (setq nbr11 (getint "/n donner nombre acier")) (setq D2 (getint "/n donner le diamètre acier")) (command "diviser" d1 "B" "cercle" "O" (- nbr11 1)) (entdel d1) (command "inserer" "cercle" ptac3 1 1 0 D2 "") (command "inserer" "cercle" ptac4 1 1 0 D2 "") )
VDH-Bruno Posté(e) le 20 juillet 2011 Posté(e) le 20 juillet 2011 Salut, Oui avec diviser ( _divide) ou avec mesurer ( _measure) ça marche également, ces 2 façons de faire font appel aux blocs c’est la leurs intérêts, si tu veux varianter encore tu peux aussi tenter avec la commande reseau ( _array). Il me semble qu’il est même possible de faire quelque chose avec une veille commande AutoCAD non documenté mais là ma mémoire me joue des tours et je n’arrive plus à retrouver la syntaxe exacte pour vérifier si AutoCAD la supporte encore.. ( une sorte d’insertion multiple). Sinon dans ton code, cette ligne ne sert à rien : (setq D2 (getint "/n donner le diamètre acier"))Et les suivantes : (command "inserer" "cercle" ptac3 1 1 0 D2 "") (command "inserer" "cercle" ptac4 1 1 0 D2 "")Seraient mieux écrite comme ceci : (command "inserer" "cercle" ptac3 1 1 0) (command "inserer" "cercle" ptac4 1 1 0)Pour t’en convaincre teste ton code en faisant varier le diamètre de tes aciers, tu verras que la variation n’est pas prise en compte. Si tu veux insérer des cercles (sous forme de bloc) symbolisant une répartition d’acier sur un axe (de façon simple et en gardant l’esprit de tes routines). Sur ton premier code - Tu craies ton bloc « cercle » avec un cercle unitaire- Tu propose à l’utilisateur d’entrer le diamètre que tu mémorise comme tu l’as réalisé dans ton deuxième code (au passage les diamètres d’aciers étant normalisés tu peux verrouiller les saisies avec la fonction initget)- Puis tu fais varier l’échelle x et y de ton bloc à l’insertion. Sur ton second code avec diviser (pour l’exercice et pour faire simple)- Tu craies autant de bloc que tu as de section d’acier normalisé (ex : cercle8 cercle10 cercle12 ect..).-Tu verrouille les saisies du type HA8 HA10 HA12 avec la fonction initget (avant la saisie du diamètre par l’utilisateur).-Puis avec un cond tu fais correspondre pour chaque saisie possible le bloc correspondant à insérer. Cordialement, Apprendre => Prendre => Rendre
Invité pleche.damien Posté(e) le 21 juillet 2011 Posté(e) le 21 juillet 2011 Merci pour ton aide Bruno, je vais y jeter un coup d'oeil, oui tu as raison le diamètre D2 ne sert à rien dans se bou de programme, mais g oublier de spécifier que cette ligne me servira pour réaliser ma futur nomenclature d'acier. une question: et il possible de créer plusieur bloc dans le même fichier autocad DWG et ensuite de le faire appel par le chemin de parcours enregistrer dans option. Parsque je me suis rendue compte que si mon bloc se nome de la même façon que mon fichier DWG il y a une confusion et donc il ne l'insert pas (à voir)... Si non pour ma nomenclature j'aimerai que au fure à mesure du choix de sélection d'acier le texte du type d'aciers (routine deja faite voir si dessous ) s'insère en colone avec un espacement constant, tu à peut etre une idée ( je pensée donc insérer à partir d'un point "pt30" par exemple et de réaliser PEUT ETRE utiliser la fonction SI "if". Mais la je bloque.... Par exemple si je prend 3 types d'aciers: acierU; acierfilant; aciercadre -par exemple si le premier acier inséré (dans le désordre) et acier filant j'aurais 8HA10 Filant-le deuxième acier que je choisi est acierU 4 U HA8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;définition type d'acier;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq Pttext (polar ptac3 0 50)) ; définition de la variable Pttext qui se placera à 50 cm du point pt01 à un angle de 0 (setq nbrbarrestxt (itoa nbr11)) ; réatribue à la variable nbrbarrestxt les données de la variable nbr11 ; itoa permet de retransrire la valeur entière du réel (setq D (itoa D2)) (setq texte1 (strcat nbrbarrestxt " " D " filants ")) ; strcat fonction pour retransrire à l'écrit ; défini la variable texte1 en fonction du nombre de barre ; "" désignant un espace; D le diamètre (sans guillemet pour montrer la valeur numérique de la variable D ; "filant" le type d'acier qui reste entre guillemet pour montrer le text (command "texte" Pttext 4 0 texte1) ; la command texte permet d'écrire le type de repérage des aciers ; au point pttext et avec les données de texte1 ) ;;;;;;;;;;;;;;;;;;;;;fin texte type acier;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ma proposition est: (setq pt30 (getpoint "/n donner le premier point de la nomenclature")) ; défini le point de début de la nomenclature (initget 1 acierU acierfilant aciercadre) ;commande boucle, (cond (( = choix "acierU") (command "inserer" "PttextU" ptac30 1 1 0)) (( = choix "acierfilant") (command "inserer" "Pttext" ptac30 1 1 0)) (( = choix "aciercadre") (command "inserer" "Pttextcadre" ptac30 1 1 0)) Mai je ne sais pas comment déplacer le texte "type d'acier" en fonction de son onrde d'insertion (déplacement constant en colone).... Peut etre utiliser la fonction SI mais je ne sais pas faire comme je suis un débutant en lisp Merci pour votre aide.Cordialement
VDH-Bruno Posté(e) le 21 juillet 2011 Posté(e) le 21 juillet 2011 Bonsoir, Merci pour ton aide Bruno, Il n’y a pas de quoi, pour la suite j’ai bien peur de ne plus être d’un grand secours car j’ai peu de temps et beaucoup de mal à comprendre tes questions (même si le ferraillage et un domaine qui ne m’est pas totalement étranger). Si ton objectif est de créer un ensemble de routines permettant d’automatiser la production de plans de ferraillage (Au vu d’une rapide recherche sur tes différents post), je ne pense pas qu’il soit nécessaire dans l’immédiat de te pencher sur les problèmes de nomenclature (c’est comme en dessin la nomenclature on l’établie toujours une fois le plan réalisé, cela évite les ratures). Je pense que tu gagneras plus à te recentrer sur l’automatisation de tes dessins (soit pas la personnalisation et/ou la programmation), car je ne suis pas sur que ce point soit complètement atteint. Par la suite tu attaqueras plus facilement les problèmes de mise en page et de nomenclature (très certainement avec une approche toute différente). je suis un débutant en lisp Si tu me permets un petit conseil amical fixe toi des objectifs simple et clair mènent les à leurs termes, évite d’attaquer plusieurs codes en même temps (même si c’est très tentant au début) au risque de n’en terminer aucun . A+ [Edité le 21/7/2011 par VDH-Bruno] Apprendre => Prendre => Rendre
Invité pleche.damien Posté(e) le 22 juillet 2011 Posté(e) le 22 juillet 2011 oui je comprend bien mais comme c'est un projet que je doit mener à terme d'ici 1 mois j'esaye de voir toutes les difficultés que je rencontre (c'est notament une de ma dernier difficulté) pour finir se projet d'école (avec mes moyen bien sure et le temp qui mes accordé)... Pour info c'est l'automatisation d'un coffrage et ferraillage d'une semelle isolée. Voila en tout cas merci encore, et pour se qui veule me donner des compléments pour que les lignes de texte de ma nomenclature se range en colone... en fonction de l'ordre d'insertion des aciers. Merci d'avance (PS: pour ce qui on mal compris me question n'hésiter pas)vous trouverez si dessus les lignes lisp que j'ai commencé à étudier, reste à améliorer tout sa!!! Cordialement :D
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant