Aller au contenu

bonuscad

Membres
  • Compteur de contenus

    5 029
  • Inscription

  • Dernière visite

  • Jours gagnés

    56

Tout ce qui a été posté par bonuscad

  1. Voici une routine permettant de faire des copies alignés comme pourrait le faire mesurer ou diviser. Si tu veut une échelle différente d'alignement, je te conseille de tracer ton objet d'alignement non réduit. D'appliquer la commande a cet objet,et de réduire l'ensemble du résultat a ta nouvelle longueur d'alignement. Je n'ai peut être pas bien saisi ton problème et la solution ne convient donc pas? :( Bruno V. (defun c:copyalign ( / js pt ent cod dlt ename) (setvar "cmdecho" 0) (prompt "\nChoix des objets devant être répétés ") (setq js (ssget)) (cond (js (setvar "blipmode" 0) (setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384))) (initget 9) (setq pt (getpoint "\nPoint d'insertion des objets sélectionnés: ")) (if (not (tblsearch "BLOCK" "cpalg$")) (command "_.-block" "cpalg$" pt js "") (command "_.-block" "cpalg$" "_yes" pt js "") ) (prompt "\nChoix de l'objet reprèsentant le parcours de copie") (while (null (setq ent (car (entsel))))) (initget "Mesurer Diviser _Measure Divide") (setq cod (getkword "\n[Mesurer/Diviser] : ")) (if (not cod) (setq cod "Measure")) (cond ((eq cod "Measure") (initget 7) (setq dlt (getdist "\nInterdistance de répétition: ")) (command "_.measure" ent "_block" "cpalg$" "_yes" dlt) ) ((eq cod "Divide") (initget 7) (setq dlt (getint "\Nombre de division: ")) (command "_.divide" ent "_block" "cpalg$" "_yes" dlt) ) (T nil) ) (command "_.undo" "_begin") (setq js (ssget "X" '((0 . "INSERT") (2 . "cpalg$")))) (while (setq ename (ssname js 0)) (command "_explode" ename) (setq js (ssdel ename js)) ) (command "_.undo" "_end") ) ) (princ) )
  2. bonuscad

    Commande _dtext

    Bonjour Dominique, Justement je n'utilise jamais _dtext en lisp. Il me semble même me souvenir que c'est déconseiller ou même impossible Il est logique de penser qu'il est impossible de connaitre le nombre de ligne que voudrait introduire l'utilisateur à qui tu donne la main. L'autre erreur est de ne pas soumettre une chaine de caractère. Ceci devrait fonctionner: ;) (command "_.text" pause "0.2" pause (itoa (getvar "useri1")))
  3. bonuscad

    Terrain 3d

    Bonjour, Dans la zone de téléchargement en gratuiciel sur ce même site tu trouveras un développement (Bonuscad) qui permet à l'aide d'un free (génial !) :Triangle.exe et d'un lisp associé: trinod.lsp de faire ce que tu désire. J'ai développer ce lisp en direction de la Topographie, malgré tout tu peux essayer voir s'il fait l'affaire :cool:
  4. bonuscad

    Incompréhensible

    Dans ce cas précis, lorsque je veux qu'on se rende compte de l'activitée. Je fais une boucle comme suit; (c'est proche de ta boucle) (defun c:test ( / ) (setq total 5000 n 0) (princ "\nProgramme en cours ...\\") (while (< n total) (cond ((eq (rem n 4) 0) (princ "\rProgramme en cours ...|") ) ((eq (rem n 4) 1) (princ "\rProgramme en cours .../") ) ((eq (rem n 4) 2) (princ "\rProgramme en cours ...-") ) ((eq (rem n 4) 3) (princ "\rProgramme en cours ...\\") ) ) (setq n (1+ n)) ) (princ "\nProgramme terminé !...") (princ) )
  5. bonuscad

    Incompréhensible

    Excuse, j'ai compris ton problème. Ce n'est pas une erreur de code pour t'en assurer tu peut utiliser la fonction (grread) juste avant ta boucle pour mettre un point d'arrêt à ton prog. Tu verras alors que l'affichage est bien géré avant l'entrée dans ta boucle. Donc je pense que c'est la fonction (alert) qui occasionne ce défaut d'affichage. J'ai bien essayer la fonction (texscr) mais que dalle. La solution qui peut se présenter, si tu veux malgré tout utiliser (alert) et de passer par la fonction (grtext -2 "message") au lieu de (princ) mais ce n'est pas sur la ligne de commande. A moins que quelqu'un ai une autre solution?
  6. bonuscad

    Incompréhensible

    Dans ton exemple, dans la boucle, tu incrémente N, puis tu affiche sa valeur. Dans ce cas la valeur pour N=0 ne seras pas affiché (puisque déjà incrémenté). et l'affichage sera erroné de n+1 tu sortiras de la boucle avec l'affichage de N=5 (ce qui n'est pas strictement < 5) Il te faut inverser tes 2 lignes; incrémentation et affichage. Je pense que tu vas comprendre ton erreur, Allez zou à l'eau! ;)
  7. Toujours dans le même esprit: (ssget "x" '((0 . "VIEWPORT") (8 . "0"))) Dans ce cas toutes les fenêtres dans le calque "0" sera retourné. Remarque: ssget "X" permet la sélection dans la TOTALITE du dessin, que tu sois dans l'EO ou EP, que les calques soient inactif ou geler. Donc par cette méthode aucune fenêtre ne peut échapper a ta selection. Attention à la syntaxe: '((0 . "VIEWPORT)) corect '((0."VIEWPORT)) incorrect (pas d'espace) Bien sur tu peut remplacer "0" par "nom de ton calque"
  8. Rapidement une adresse parmi tant d'autre: http://www.home.gil.com.au/~patrickf/ Regarder la fonction REVPOLY Je n' ai pas testé
  9. Pour une version non LT Active ta fenêtre de propriété Clique sur le bouton "Selectionner des objets" Au message de la ligne de commande taper la ligne suivante: (ssget "X" '((0 . "VIEWPORT"))) et valide les objets, tu pourras alors verrouiller toutes les fenêtres. Tu peux utiliser aussi _FILTER (Attention 'FILTRE bug) Sauf qu'au message choix des objets il faut répondre le mot magique "TOUT" ("_ALL) ;) et surtout pas de sélection par fenêtre.
  10. Une routine Lisp existe pour inverser le sens d'une polyligne et peut être aussi des lignes. Je pense que c'est la solution que tu recherche. je ne l'ai pas dispo, fait des recherche ou une ame charitable.....
  11. bonuscad

    Xref Ralentissent les manip.

    Dès fois que.... Réponse toute bête: Lors de tes fenêtres de sélection, si ton ACCROBJ est actif cela peutaugmenter considérablement le temps de réponse. En effet pour obtenir le point d'accroch demandé, AutoCAD est obligé de parcourir la base de données de l'XREF pour voir si un point correspond à la demande. Si tu n'a pas besoin d'obtenir un point dans un xref, désactive l'accrobj, tu verras c'est le jour et la nuit. :P
  12. bonuscad

    Pas bien QAFLAGS!

    Un grand Bravo a ta remarque. Tu lève le voile sur l'un des comportement inexpliqué d'AutoCAD. Beaucoup d'utilisateurs vont trouver la réponse à leur problème au lieu de s'arracher les cheuveux :angel: Il faut trouver maintenant les autres coins du voile, ( pas le foulard ;) )
  13. La routine gomme.lsp de 1998 de Patrick Emmin qui est sous forme cryptée, a sussicté mon intêret. ;) A l'époque cette routine était fortement interressante car les option Trajet Capture et Fenêtre polygonale n'existaient pas. Maintenant son utilité est moindre, quoique ....?! J'ai donc plagié son idée (pas son code: il est crypté !...) Mon but n'était pas de réecrire la fonction, mais de voir si je pouvais m'en servir pour autre chose. En voici le résultat: (defun C:GOMME ( / tmp cod_rub e_sel) (defun draw_pt (pt / pt1 pt2 pt3 pt4) (setq rap (/ (getvar "viewsize") 50) pt1 (list (+ (car pt) rap) (+ (cadr pt) rap)) pt2 (list (+ (car pt) rap) (- (cadr pt) rap)) pt3 (list (- (car pt) rap) (- (cadr pt) rap)) pt4 (list (- (car pt) rap) (+ (cadr pt) rap)) ) (grdraw pt pt1 -1) (grdraw pt pt2 -1) (grdraw pt pt3 -1) (grdraw pt pt4 -1) ) (princ "\n[Click-Gauche]: Effacement Actif/Inactif [Click-Droit]: Quitte la gomme dynamique ") (princ "\nGomme <>") (while (or (= 5 (car (setq tmp (grread t 5 2)))) (= 3 (car tmp))) (if cod_rub (draw_pt (cadr tmp))) (cond ((= 3 (car tmp)) (if (null cod_rub) (progn (setq cod_rub T) (princ "\nGomme <>") ) (progn (setq cod_rub nil) (princ "\nGomme <>") ) ) ) ((= 5 (car tmp)) (cond ((and cod_rub (setq e_sel (nentselp (cadr tmp)))) (cond ((eq 'ENAME (type (car (last e_sel)))) (entdel (car (last e_sel))) ) ((eq "VERTEX" (cdr (assoc 0 (entget (car e_sel))))) (entdel (cdr (assoc 330 (entget (car e_sel))))) ) (T (entdel (car e_sel))) ) ) (T nil) ) ) (T (princ "\nArrêt anormal de la commande ")) ) ) (princ "\nCommande terminée. ") (prin1) ) De cela j'ai pensé en faire ceci: (defun C:ID3DYN ( / tmp cod_rub e_sel p) (defun draw_pt (pt / pt1 pt2 pt3 pt4) (setq rap (/ (getvar "viewsize") 50) pt1 (list (+ (car pt) rap) (+ (cadr pt) rap)) pt2 (list (+ (car pt) rap) (- (cadr pt) rap)) pt3 (list (- (car pt) rap) (- (cadr pt) rap)) pt4 (list (- (car pt) rap) (+ (cadr pt) rap)) ) (grdraw pt pt1 -3) (grdraw pt pt2 -3) (grdraw pt pt3 -3) (grdraw pt pt4 -3) ) (princ "\n[Click-Gauche]: Identification 3D Actif/Inactif [Click-Droit]: Quitte la commande ") (princ "\nID3Dyn <>") (while (or (= 5 (car (setq tmp (grread t 5 2)))) (= 3 (car tmp))) (if cod_rub (draw_pt (cadr tmp))) (cond ((= 3 (car tmp)) (if (null cod_rub) (progn (setq cod_rub T) (princ "\nID3Dyn <>") ) (progn (setq cod_rub nil) (princ "\nID3Dyn <>") ) ) ) ((= 5 (car tmp)) (cond ((and cod_rub (setq e_sel (nentselp (cadr tmp)))) (setq p (osnap (cadr e_sel) "_near")) (cond (p (setq p (trans p 1 0)) (grtext -2 (strcat (rtos (car p)) "," (rtos (cadr p)) "," (rtos (caddr p)) ) ) ) (grtext -2 "") ) ) (T nil) ) ) (T (princ "\nArrêt anormal de la commande ")) ) ) (grtext -2 "") (princ "\nMode interrogation point 3D en dynamique terminé. ") (prin1) ) Merci à Patrick pour l'idée, et bravo pour son code d'origine qui fonctionne encore sur 2002 sans aucune retouche malgré les version successives d'Autocad (preuve qu'il est bien écrit). Mais je pense que j'ai eu plus de facilité car j'ai pu utiliser la fonction (nentselp) qui je pense n'existait pas lors de la conception du code d'origine.
  14. Tu peux utiliser aussi les boutons à bascule (ON/OFF) situés sur la barre d'état (là où s'affiche les coordonées en dynamique) C'est le boutton PAPIER / OBJET (le dernier) Personellement je me sers beaucoup de ces boutons, qui renseignent sur l'état Actif ou Inactif du mode concerné et servent aussi commande rapide. Je les préfère maintenant au touches classiques F1 F2 F3 etc...
  15. bonuscad

    Choix des objets

    En version pleine, on pourrait utiliser le code suivant: (c'est qu'une ébauche à perfectionner et à tester) (defun C:plss( / ENT p_open PTLST DAT LL IDX SS) (while (not ENT) (setq ENT(entsel "\nSélectionner une Polyligne:")) (if ENT (progn (setq ENT(entget(car ENT))) (if (/= (cdr(assoc 0 ENT)) "LWPOLYLINE") (progn (prompt "\nEntitée sélectionée n'est pas une Polyligne. Réessayer") (setq ENT nil) ) (progn (if (/= (logand(cdr(assoc 70 ENT)) 1) 1) (setq p_open T) (setq p_open nil) ) ) ) ) (prompt "\nAucune sélection. Réessayer") ) ) (setq LL(length ENT) IDX 0 ) (repeat LL (setq DAT(nth IDX ENT)) (if (=(car DAT)10) (progn (if (not PTLST) (setq PTLST(list(cdr DAT))) (setq PTLST(append PTLST(list(cdr DAT)))) ) ) ) (setq IDX(1+ IDX)) ) (cond (p_open (setq SS (ssget "_F" ptlst)) ) (T (initget "Fenetre Capture") (if (eq (getkword "\nSélection par [Fenetre/Capture]: ") "Capture") (setq SS(ssget "_CP" ptlst)) (setq SS (ssget "_WP" ptlst)) ) ) ) (setvar "PICKFIRST" 1) (sssetfirst nil SS) (princ) ) NB: Bien que les objets ne soient pas mis en surbrillance avec les poignées malgré PICKFIRST, la sélection est bien effective. Si polyligne ouvertre sélection par Trajet, fermée : proposition de Fenêtre ou Capture.
  16. bonuscad

    Menu contextuel...

    Bonjour Voici la solution Lisp pour un menu contextuel que j'ai déjà relaté ailleurs. C' est une question de syntaxe dans le code. Il faut utiliser entre crochets et séparer par des slash les option que l'on désire voir affichées dans le menu contextuel. Mais rien ne vaut un bon exemple, voici par exemple la meilleure syntaxe à utiliser. (defun c:mnutextuel ( / cle_cod) (initget "Bonjour Aurevoir _Hello Goodbye") (setq cle_cod (getkword "\nChoix de l'option [bonjour/Aurevoir]? : ")) (if (null cle_cod) (setq cle_cod "Hello")) (cond ((eq cle_cod "Hello") (print cle_cod) (prin1 " : Bonjour tout le monde") ) ((eq cle_cod "Goodbye") (print cle_cod) (prin1 " : Au revoir tout le monde") ) (T (print cle_cod) (prin1 " : Erreur") ) ) (prin1) ) Notez la présence du language international dans initget de "_Hello" et "Goodbye" (seul la 1ere option internationale possède le underscore, voulant dire que les options suivantes le sont aussi) Cette syntaxe permet d'adapter la routine facilement pour une version non-française. NB: cle_cod retourne dans ce cas toujours les mots-clé en Anglais ("Hello" et "Goodbye" sans underscore) Ceci est valable aussi pour les fonction d'entrée (getxxx ...) du moment qu'une clé est définie dans (initget), enfin je pense?! [bonjour/Aurevoir] entraine l'affichage des options dans le menu contextuel SI la variable SHORTCUTMENU est définie pour assumer les menus contextuels Voilà si ces infos peuvent te rendrent service. ;) Bruno Rajout des BBcodes [Edité le 19/11/2010 par bonuscad]
  17. bonuscad

    Sélection rapide ?

    Au début on trébuche souvent, ((0 . "LINE") (8 . "bdu-télécommunication") (210 0.0 0.0 1.0)) ne peut fonctionner car il concerne des lignes (objet primitif) qui ne peuvent plus être décomposés. Je suppose que le filtre a été constitué par la sélection d'un objet modèle qui dans ton cas était une ligne La sélection d'une polyligne comme modèle aurait mieux convenu ;) Concentration... concentration Bonne chance
  18. bonuscad

    Sélection rapide ?

    Désolé de n'avoir pas été plus explicite. C'est bien, tu étais près du but! 1ere erreur: sur le filtre de polyligne, ton filtre ne concernait que les anciennes polylignes pas les nouvelles 2eme erreur: tu as soumis l'indice a la commande explode au lieu du NOM de l'entité 3eme erreur: tu n'a pas inclu la commande explode dans la boucle En corrigé (en gardant la struture de ton code) cela donne (setq ss2 (ssget '((-4 . " (-4 . " (0 . "POLYLINE") (-4 . "AND>") (-4 . " (0 . "LWPOLYLINE") (-4 . "AND>") (-4 . "OR>")) ) ) (setq sslen (sslength ss2) j 0 ) (while (< j sslen) (setq temp (ssname ss2 j)) (setq j (1+ j)) (command "_.explode" temp) ) Rappel: Pour en revenir a ta question d'origine, a tu essayé la routine SSX ou (ssx) des express tools pour utilisation dans une commande standard d'AutoCAD NB : Je ne sais pas si cette fonction est toujours disponible en 2004 (2002 oui)
  19. bonuscad

    Sélection rapide ?

    Bonjour et Bonne année à toi aussi !.. :P En effet la contrainte de l'utilisation "_explode" par le lisp et que la commande attend par programmation le NOM de l'entitée. Tu dois donc parcourir ton jeu de sélection a l'aide de la fonction (ssname jeusel indice) à travers une boucle (while ...) ou (repeat ...) dans laquelle il ne faut pas oublié d'incrémenter ton indice pour parcourir tout le jeu de séléction. NB:La fonction xplode.lsp d'autodesk dans le dossier support est articulée comme cela. Voilà pour le principe
  20. Salut, Le plus simple, si le drivers OCE le permet, est d'aller dans le panneau de configution des imprimantes de Windows. Accéder par les propriété de l'imprimante au panneau de configuration propre a ton périphérique. Logiquement du devrais avoir un onglet avec les formats papier. Dans cette onglet tu devrais avoir accés à la définition d'un format personnalisé. Si ton drivers le permet tu devrais déjà pouvir définir un format de papier long. ex 914mm x 2500mm. Après dans AutoCAD tu retrouveras ce format de papier dans les choix possible. J'espère que cela répondra a ton problème. Bruno
  21. Tu as dessiné ton profil au sol, bien! Assure toi que c'est une polyligne fermée, en fait le mieux serait que ton profil filaire ait une épaisseur représenter donc par un contour. Basule alors sur le SCU en Z orienté comme pour une coupe. Dessinne avec une polyligne classique 2D ton arrête filaire constituer d'arc et contre arc. Retourne dans le SCG utilise alors la commande extrusion, choisis ta polyligne ferméer au sol Après validation des objets choisis l'option "Chemin" et désigne ton arrête filaire Si les arcs existant ne présente pas de rayon trop petit pour pouvoir faire aboutir la commande, cela devrait fonctionner Bruno
  22. Vois les fonction lisp (ssgetfirst) et (sssetfirst...) et attention à la variable PICKFIRST Je l'ai utilisé, et malgré que les grip ne s'affiche pas (mon code n'est peut etre pas tout à fait bon,donc je ne donne pas d'exemple) seléction/action fonctionne. Bruno
  23. Un avis de plus à la mer (comme la bouteille) ;) Le terme DAO pour AutoCAD dérape (à mon avis) vers CAO. Je regrette tout simplement que des fonctions de base du dessin soit toujours aussi pauvres. Pourquoi n'est il toujours pas possible d'élever facilement (pas abaisser) une perpendiculaire (comme on le fait avec une equerre!) Dans le même sens: obtenir facilement la continuation par un arc ou ligne comme le fait actuellement ligne ou arc (par la réponse nul) au dernier objet dessiné. Pourquoi les arcs ne possède toujours pas de nouvelles options de contruction (tangentes différées comme l'option TTR de cercle) Ces remarques s'applique déjà à la 2D, base d'un logiciel de dessin. Je pense tout simplement qu'il ne faudrait pas oublier les commandes de base au détriment d'une soi disante productivité...
  24. Noise, Sur ce même site tu trouveras dans la zone "gratuiciel" des téléchargements "BonusCAD" Tu peux choisir d'installer l'ensemble, mais tu peux aussi recuperer que les fichiers: clothoide.lsp et idclo.lsp qui, je pense, répondent a tes besoins ;) Bruno
  25. bonuscad

    bug de calcul très vicieux

    Il est dit qu'Autolisp utilise en interne des valeur 32 bits (et que les valeur transferées à AutoCAD sont limitées à 16) Pour t'en assurrer essaye (rtos (- pi 3) 2 16) Donc à 12 décimale je pense qu'il ne doit pas "souffrir" bien qu'il est en limites. (12 + 4 chiffre significatif), l'écart ne devrait concerné que l'arrondi du dernier chiffre. Toujours est il que je comprend pas pourquoi l'écart est si grand avec des valeurs qui ne sont pas le résultat d'un calcul précédent Si l'écart est si important, je veux bien récupérer les résisudus des opérations informatique des transactions boursières. Pour moi ça me suffirait ;) si tout les 8000€ j'en récupére le 1E-12 je prends! NB tiré des conversion d'unité d'Autodesk *meter(s),metre(s),m -1,0,1,0,-1,4.1214856408e11,0 In this example, the constants that make one meter are as follows: Utiliser 11 chiffre après la virgule ne leur a pas apparu incongru.
×
×
  • 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é