mateus Posté(e) le 22 juillet 2013 Auteur Posté(e) le 22 juillet 2013 Bonjour Didier ! pas de problème j'accepte complètement les critiques, elles sont là pour me faire avancer , c'est comme ça que je le prend en tout cas. Et puis face à des gens comme vous qui ont l'habitude de programmer et qui ont de l'expérience, on ne peut qu'en tirer profit. Pour l'instant j'essaie de faire mon programme , qu'il fonctionne dans un premier temps et après je m'occuperai de l'optimiser et de le rendre plus simple si possible. J'ai également une question car j'ai du mal avec l'incrémentation et j'en ai besoin pour la partie que je traite. Je souhaite boucler le long de ma droite l'insertion des blocks mais je suis coincé : (defun CALCULPOINT (PX PY module orient distDroite / pt) (setq pt(list PX PY)) ;premier luminaire (setq lst_pt (list pt)); première liste avec le premier luminaire (while(< module distDroite) (setq pt(polar pt orient module)) (setq lst_pt(cons pt lst_pt) ) ) ) Avec pt la première insertion du blocEnsuite je crée une liste avec ce premier pointJe dis au programme tant que l'entraxe entre les deux points n'est pas plus grand que la distance de la droite alors :on redéfini le "pt" avec (polar)Et je redéfini la liste des points en ajoutant à chaque fois le dernier point jusqu'à ce que la boucle retourne nil Merci bien
mateus Posté(e) le 22 juillet 2013 Auteur Posté(e) le 22 juillet 2013 j'ai un soucis avec ma fenêtre d'espion qui ne s'affiche plus avec l'Autocad du boulot mais il me semble que mon code fonctionne comme ça : (defun CALCULPOINT (PX PY orient distDroite / pt pt_start increment_dist entraxeCandelabre ) (setq pt_start (list PX PY));premier luminaire (setq entraxeCandelabre (getdist pt_start "\n Indiquez l'entraxe des candélabres " ) entraxeCandelabre (/ entraxeCandelabre (cos orient)) increment_dist entraxeCandelabre lst_pt (list pt_start) ; première liste avec le premier luminaire ) (while (< increment_dist distDroite) (setq increment_dist (+ increment_dist entraxeCandelabre)) (setq pt (polar pt_start orient increment_dist)) (setq lst_pt (cons pt lst_pt)) ) ) Je vais vérifier ce soir avec mon pc. Bonne journée
mateus Posté(e) le 23 juillet 2013 Auteur Posté(e) le 23 juillet 2013 Bonjour à tous, j'ai un soucis avec le bouclage des blocs. En fait ils s'incrément bien le long de la droite mais ils dépassent la droite. Je souhaiterai que les blocs s'incrément jusqu'à la fin de la droite. En pièce jointe l'imprime écran Et voici le code: (setq pt_start (list (car projectionCandelabre)(cadr projectionCandelabre))) ;premier luminaire (setq entraxeCandelabre(getdist pt_start"\n Indiquez l'entraxe des candélabres ") entraxeCandelabre(/ entraxeCandelabre (cos orient)) ) (cond ((> distDroite entraxeCandelabre) (setq lst_pt(list pt_start); première liste avec le premier luminaire increment_dist entraxeCandelabre ) (while (< increment_dist distDroite) (setq increment_dist (+ increment_dist entraxeCandelabre)) (setq pt (polar pt_start orient increment_dist)) (command "inserer" "assistant" pt 1 1 100 "") (setq lst_pt (cons pt lst_pt)) ) ) (T(princ"\nL'entraxe de vos candélabres est trop grande pour la droite !")) ) ) Avec pt_start : la première insertionentraxeCandelabre: la distance entre deux blocsdisDroite: la distance totale Merci
mateus Posté(e) le 23 juillet 2013 Auteur Posté(e) le 23 juillet 2013 Désolé j'ai oublié l'imprime écran
mateus Posté(e) le 23 juillet 2013 Auteur Posté(e) le 23 juillet 2013 Si quelqu'un pourrait me dire d'où vient le pb ? Merci
Olivier Eckmann Posté(e) le 23 juillet 2013 Posté(e) le 23 juillet 2013 Bonjour,il ne faut pas incrémenter sur la distance totale de la droite, mais sur cette distance à laquelle on soustrait abscisse du 1er candélabre. Si ta droite fait 100m et que tu poses le 1er candélabre à 35m du début, i ne faut incrémenter que de 100-35 soit 65m sinon ça dépasse. Olivier
mateus Posté(e) le 23 juillet 2013 Auteur Posté(e) le 23 juillet 2013 Bonjour Olivier et merci pour ta réponse je vais rectifier ça dès ce soir. Je me disais bien qu'il y avait une erreur par rapport au premier candélabre. Bonne journée :)
mateus Posté(e) le 23 juillet 2013 Auteur Posté(e) le 23 juillet 2013 Gile j'avais pas vu ta réponse du post 23 mais ça fait plaisir d'apprendre ce qu'est un modulo car grâce à toi je sais ce qu'il en ai après cette petite recherche. Bonne soirée !
mateus Posté(e) le 24 juillet 2013 Auteur Posté(e) le 24 juillet 2013 Merci Olivier ça marche l'incrémentation se fait bien maintenant. Je souhaiterai désormais changer de couleur des deux entités qui composent mon bloc (avant la création du block "assistant"). Je rentre dans l'entité et je m’aperçois qu'il n'y a pas le code "DXF 62" correspondant à la couleur alors je voudrais le rajouter et y mettre le code appartenant à une couleur. Comment faire? Merci (defun c:essai () (setq pt1 (getpoint"\n premier point ")) (setq pt2 (getpoint"\n deuxième point ")) (command "polylign" pt1 pt2 "") (setq entCouleur (entget(entlast))) ;là je pensais utilisr "cons" et y rajouter le code DXF 62 mais je bloque ) Merci
mateus Posté(e) le 24 juillet 2013 Auteur Posté(e) le 24 juillet 2013 Ok j'ai compris pourquoi le code DXF correspondant à la couleur n’apparaît pas. C'est parce qu'elle est par défaut au noir. J'aimerai quand même pouvoir changer la couleur ex: (defun c:essai () (setq pt1 (getpoint "\n premier point ")) (setq pt2 (getpoint "\n deuxième point ")) (command "polylign" pt1 pt2 "") (setq entCouleur (entget (entlast))) (subst '(62 . 2) '(62.1) entCouleur) ) Ci-dessus un essai pour changer la couleur de ma polyligne en jaune alors qu'elle était en rouge au départ. Je n'arrive pas à la remplacer avec "subst" Ensuite je souhaiterai pouvoir dire au pgn : changer la couleur de l'entité en jaune par exemple peut importe la couleur de l'entité ( si elle est en noir ou déjà en jaune ) Quelqu'un aurait-il une idée? Merci
(gile) Posté(e) le 24 juillet 2013 Posté(e) le 24 juillet 2013 Salut, Lors de la création d'une nouvelle entité sa couleur par défaut est ByLayer (256) et non pas noir, et elle n'est pas ajoutée à la liste DXF de l'entité (d'où son absence). Donc, pour forcer la couleur d'une entité à une couleur de l'index, il faut tester si le groupe 62 existe ou pas dans la liste.Si le groupe n'existe pas, il faut l'ajouter, de préférence avec appendpour l'ajouter en fin de liste.Si le groupe existe, il faut le remplacer avec subst en supprimant au besoin les groupes 420 (couleurs vraies) et 430 (carnet de couleurs). Une petite fonction pour attribuer une couleur de l'index à une entité. ;; SetColorIndex ;; Attribue la couleur de l'index à l'entité ;; ;; Arguments ;; dxfList : la liste DXF de l'entité telle que retournée par entget ;; colorIndex : l'index de la couleur (entier entre 0 et 256) (defun SetColorIndex (dxfList colorIndex) (entmod (if (assoc 62 dxfList) (subst (cons 62 colorIndex) (assoc 62 dxfList) (vl-remove-if '(lambda (pair) (member (car pair) '(420 430))) dxfList) ) (append dxfList (list (cons 62 colorIndex))) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mateus Posté(e) le 24 juillet 2013 Auteur Posté(e) le 24 juillet 2013 Merci beaucoup Gile même si j'ai encore du mal avec ces fonctions : mapcar/lambda j'ai compris l'essentiel ! Bonne soirée et merci encore pour l'explication
mateus Posté(e) le 25 juillet 2013 Auteur Posté(e) le 25 juillet 2013 Bonjour à tous , J'aurai juste une question parce que je m'interroge sur la définition de prédicat j'ai regardé sur le net mais je ne comprends pas tellement la définition du terme. Est ce que quelqu'un pourrait m'expliquer grossièrement et simplement ce que c'est? Merci
(gile) Posté(e) le 25 juillet 2013 Posté(e) le 25 juillet 2013 Salut, En programmation, on appelle prédicat une fonction qui retourne une valeur booléen, soit vrai ou faux. minusp, listp, zerop, etc. sont des fonctions prédicat (c'est ce que signifie le "p" à la fin), mais les opérateurs logiques and, or, not, ou les opérateurs d'égalité et d'inégalité eq, equal, =, /=, En LISP, les valeurs booléennes pour vrai et faux sont respectivement T et nil, mais la plupart des fonctions utilisant un prédicat (if, cond, while, etc) considèrent tout résultat non nil comme vrai. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mateus Posté(e) le 25 juillet 2013 Auteur Posté(e) le 25 juillet 2013 ah d'accord je comprends mieux maintenant je savais pas que ça s'appelait prédicat par contre merci pr l'info Gile !
mateus Posté(e) le 27 juillet 2013 Auteur Posté(e) le 27 juillet 2013 Bonjour tout le monde, voilà j'ai un problème pour récupérer toutes mes "droites1" sur le prolongement de mon réseau Au début mon programme implante tous les blocs d'assistance le long de la droite(voir image ci-jointe "ASSISTANCE" (le code concernant cette partie n'est pas joint). Ensuite le bout de code ci-dessous demande à l'utilisateur de quel côté veut t'il décaler ses candélabres. J'en suis à cette étape là. Je m'occupe pour l'instant au cas ou l'utilisateur répondra par "rouge" (donc décalage en haut de la droite). Je souhaiterai récupérer toutes mes "droites1" ( image ci-jointe : "droite1") et les mettre dans une variable pour garder en mémoire tous les noms d'entités de ces dernières. Je mets aussi l'image "Schéma" pour mieux se rendre compte. (defun DECAL_CANDE (/ rep n pt3) ;;rappel : rouge : en haut ;; Bleu : en bas ;;decalageCandelabre: distance de décalage ;; lst_pt : liste des points d'insertions des blocs et aussi des droites ;; orient : l'angle de rotation ;; pt3 les points perpendiculaires aux points d'insertions des droites (initget "Rouge Bleu") (setq rep (getkword "\n De quel côté voulez vous placer vos candélabres? [Rouge/Bleu] <Rouge> : " ) ) (if (or (eq rep "Rouge") (eq rep "R") (eq rep "")) (progn ;tracé du côté rouge (foreach n lst_pt (setq pt3 (polar n (+ orient (/ pi 2)) decalageCandelabre)) (command "polylign" n pt3 "") (setq lst_droite1 (list(entlast))) ; J'ESSAIE ICI DE RECUPERER LES ENTITES MAIS SEULEMENT LA DERNIERE DROITE IMPLANTEE EST ENREGISTREE ) ) (princ "Bleu" ; en attendant le reste du programme) ) (setq jsBlock (ssget "_A" (list '(0 . "INSERT") '(2 . "assistant")))) (command "_erase" jsBlock "") ) Merci par avance
didier Posté(e) le 27 juillet 2013 Posté(e) le 27 juillet 2013 coucou voici un bon moment que tu nous parle de tes soucis, c'est le week-end je suis moins tendu au niveau du temps et je viens regarder tes messagess'il te plaît :fais une description précise et détaillée de ce que tu veux obtenir, il y a plusieurs solutions à un problème uniquealors 1 : qu'est-ce qu'on a comme point de départ (des polylignes, des points ...)2 : qu'est-ce que tu veux obtenir (des blocs insérés avec une équidistance, quels blocs ? fournis un bloc ou sa description)parce que j'ai regardé et je vois des lignes et des lignes mais je ne comprends pas. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
mateus Posté(e) le 27 juillet 2013 Auteur Posté(e) le 27 juillet 2013 Bonsoir Didier et merci pour ta réponse, en fait voilà je veux tracer mon réseau avec mes luminaires (blocs) espacés à une distance rentrée par l'utilisateur, ci-joint un imprim écran avec en haut ce que mon programme fait jusqu'à présent et en bas ce que je voudrais qu'il fasse. Je suis coincé pour récupérer les entités de mes droites qui composent le piquage des luminaires au réseau principal. une fois que je l'ai aurait récupérer je pourrai finaliser ce programme en ajustant avec raccord et effaçant les droites qui ne seront pas conservées. Merci bien en tout cas
mateus Posté(e) le 27 juillet 2013 Auteur Posté(e) le 27 juillet 2013 Au niveau des blocs j'ai un dossier ou je range 3 ou 4 blocs et j'aimerai pourquoi pas que l'utilisateur choisisse mais j'aimerai déjà régler mon problème de récupérations des entités ... Merci :)
mateus Posté(e) le 28 juillet 2013 Auteur Posté(e) le 28 juillet 2013 Bonsoir à tous , voilà je suis toujours coincé pour récupérer mes entités (jonctions des candélabres au réseau d'éclairage) pour ce faire je viens de revoir tout mon pgn en terme de commentaires, essayé d'expliqué au mieux ce que j'ai essayé de faire dans ce dernier. Je joins ce lisp en espérant que quelqu'un pourra m'aider à récupérer le noms de toutes mes entités Ps: Je sais que mon programme est loin d'être parfait, je suis loin d'être au stade de la perfection , c'est un projet d'étude qui doit bientôt se terminer. Je souhaiter garder mon programme tel qu'il est et essayé de trouver des solutions aux problèmes que je rencontrerai jusqu'à la fin de ce programme sans toucher les fonctions ou commandes que j'ai fait avant. Merci de bien comprendre ma démarche. Bonne soirée à tous AmicalementCommandes_v0.1.1.LSP
mateus Posté(e) le 30 juillet 2013 Auteur Posté(e) le 30 juillet 2013 Bonjour, Est ce que quelqu'un pourrait me dire comment récupérer mes entités et ce à chaque jonction (fonction n°8) de mon programme joint en post #46, c'est important je dois rendre mon projet d'étude dans un mois et il faut que je puisse résoudre cela avant de poursuivre. Merci bien Amicalement
didier Posté(e) le 30 juillet 2013 Posté(e) le 30 juillet 2013 Coucou Merci de bien comprendre ma démarche. c'est de l'humour...la semaine est repartie et la production passe avant tout donc moins de temps à te consacrer. tu as le mérite de t'accrocher, c'est très bien.tu as le défaut de garder des explications dans ta têtedis-nous ce que tu veux dire parcomment récupérer mes entitésj'ai lancé le programme mais comme tu n'as pas donné de bloc candélabre j'en ai fait un bidon et je ne comprends pas toutes les questionsla première ligne définit quoi ? "sélectionner le premier point de votre alignement"ensuite le décalage par rapport à la ligne, c'est quoi ? valeur de décalage du réseaule côté du réseau ???ensuite tu demandes : "cliquez sur le premier candélabre" ??? il y en a un d'inséré ??ensuite tu demandes : "Indiquez le décalage des candélabres" c'est un décalage par rapport à quoi ? à moins que ce soit un entre-axe.ah ben non tu le demandes maintenant l'entre-axes. et ainsi de suite ... je te propose de nous faire un dessin autocad avec les différents stade d'évolution et le déposerpour mémoire, fais un zip ou un pdf car le site n'accepte pas les dwg en pièce jointe ce qui est un comble avouons-le. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
mateus Posté(e) le 31 juillet 2013 Auteur Posté(e) le 31 juillet 2013 Bonjour Didier : Merci encore pour ta réponse malgré le temps que tu n'as pas forcément. tu as le mérite de t'accrocher, c'est très bien. En fait j'ai pas le choix j'ai mis tellement de temps à me mettre à programmer car j'ai bloqué complètement dessus. tu as le défaut de garder des explications dans ta tête c'est pas faux, mais c'est que je vois que le temps avance et qu'il ne me reste plus beaucoup de temps car mon projet est loin d'être fini encore. sélectionner le premier point de votre alignement" j'ai décidé de dire à l'utilisateur de cliquer sur deux points pour que je me base sur celui-ci pour implanter la suite de mon programme (car plus facile, je connais déjà les deux sommets de la polyligne) ensuite le décalage par rapport à la ligne, c'est quoi ? valeur de décalage du réseau Le décalage par rapport à l'alignement est le réseau principal d'éclairage donc c'est sa distance de décalage que je demande. le côté du réseau ??? Le côté du réseau comme tu pourras le voir sur les pdf , c'est le côté du réseau principal que l'utilisateur aura choisit pour implanter ses luminaires(candélabres) "cliquez sur le premier candélabre" ??? il y en a un d'inséré ?? Non, bien vu, il n'y en a pas encore c'est une erreur de faute de français. ensuite tu demandes : "Indiquez le décalage des candélabres" c'est un décalage par rapport à quoi ? à moins que ce soit un entre-axe. Ici le décalage des candélabres c'est celui qui part du réseau principal d'éclairage jusqu'aux points d'insertions des candélabres. (la distance des blocs "assistants" de part et d'autre du réseau est égale à ce décalage) Je te joins à ce #post, 4 pdf qui contiennent les explications graphiques de ce que je souhaite faire avec le programme. Mes 3 problèmes actuellement sont: (en dehors de la mise en forme, optimisation du code, car je n'ai malheureusement plus le temps de retoucher le programme tel qu'il est défini désormais, je souhaite juste débloquer les derniers points ) - L'orientation des candélabres qui n'en fait qu'à sa tête, je ne comprends pas pourquoi ils s'orientent mal - Le fait de devoir cliquer à chaque fois sur la souris pour faire apparaitre les piquages des candélabres (je ne sais pas si cela te le fais aussi avec ton post mais avec 2 ordi essayés, l'erreur y est encore.)- Récupérer mes entités de polylignes sous forme de liste pour pouvoir joindre et raccord avec rayon sur le réseau principal. Merci beaucoup pour l'aide Amicalement.Explications phase 1-2.pdfExplications phase 3-4.pdfExplications phase 5.pdfExplications_details_entitees.pdf
didier Posté(e) le 1 août 2013 Posté(e) le 1 août 2013 Coucou je te remercie car c'est plus clair pour moi sauf la dernière : récupérer les entités ????? suivant le temps que je trouve je reviens vers toi avec des propositions amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
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