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. Je peux pas avoir bon du 1er coup :mad: En effet si la direction est colinéaire au Z du SCG, ça donne un résultat bizarre! J'ai du oublier une condition (faudra que je trouve :casstet: ) Mais si tu t'appuis sur des diagonales, ç a marche bien non? Extrait de l'aide: L'algorithme d'axe arbitraire est utilisé en interne par AutoCAD pour mettre en œuvre une génération arbitraire mais homogène de systèmes de coordonnées d'objet pour toutes les entités qui utilisent un système de coordonnées d'objet.
  2. Autre possibilité, tu utilises un appel à (command) dans une récursivité. Mais comme dit Tramber sans voir le code, difficile de deviner :casstet:
  3. (gile) j'adore ce genre de défi, j'en ai bavé (surtout pour la fonction z_dir) :casstet: mais je crois y être arrivé :D La routine n'est pas achevée pour faire la flèche mais le plus gros est fait. Donc il est possible de fournir 2 points en 3D et une polyligne2D sera créée dans son SCO. NB: Pour l'instant je n'ai essayé que depuis le SCG, je pense qu'il faudra encore adapter pour l'acquisition depuis un SCU (defun z_dir (p1 p2 / ) (trans '(0.0 1.0 0.0) (mapcar '(lambda (k) (/ k (sqrt (apply '+ (mapcar '(lambda (x) (* x x)) (mapcar '- p2 p1) ) ) ) ) ) (mapcar '- p2 p1) ) 0 ) ) (defun c:make_arrow ( / pt1 pt2 k pt_x dxf_210) (initget 9) (setq pt1 (getpoint "\nPoint de départ de la flèche: ") pt2 pt1) (initget 9) (while (equal pt2 pt1) (setq pt2 (getpoint pt1 "\nPoint d'arrivée de la flèche: ")) (if (equal pt2 pt1) (progn (princ "\nLe point de départ et d'arrivée sont confondus!") (initget 9) ) ) ) (setq pt1 (trans pt1 1 0) pt2 (trans pt2 1 0) k (/ (- (distance pt1 pt2) (* (getvar "DIMSCALE") (getvar "DIMASZ"))) (distance pt1 pt2)) pt_x (mapcar '+ pt1 (mapcar '(lambda (x) (* k x)) (mapcar '- pt2 pt1))) dxf_210 (z_dir pt1 pt2) pt1 (trans pt1 0 dxf_210) pt_x (trans pt_x 0 dxf_210) pt2 (trans pt2 0 dxf_210) ) (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 62 (if (eq (getvar "CECOLOR") "BYLAYER") 256 (getvar "CECOLOR"))) (cons 6 (getvar "CELTYPE")) (cons 370 (getvar "CELWEIGHT")) (cons 100 "AcDbPolyline") (cons 90 3) (cons 70 0) (cons 38 (caddr pt1)) (cons 39 (getvar "THICKNESS")) (cons 10 (list (car pt1) (cadr pt1))) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 10 (list (car pt_x) (cadr pt_x))) (cons 40 (/ (* (getvar "DIMSCALE") (getvar "DIMASZ")) 3.0)) (cons 41 0.0) (cons 42 0.0) (cons 10 (list (car pt2) (cadr pt2))) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 210 dxf_210) ) ) (prin1) ) Modifiée, devrait fonctionner dans toutes situation en 3D, s'appuie sur la taille des flèche de cotation [Edité le 5/4/2006 par bonuscad][Edité le 6/4/2006 par bonuscad] Modifié après une suggestion de (gile) sur l'usage de DimScale et l'identification d'un bug lors de l'utilisation parralèle à l'axe des Z [Edité le 6/4/2006 par bonuscad]
  4. bonuscad

    Lignes arbuste et talus

    Pour les haies un SUJET et un AUTRE Et il ya la fonction rechercher ;)
  5. bonuscad

    choix de valeurs

    J'ai exagéré le terme, disons que c'est une bonne habitude à prendre. En déclarant celles-ci, lors de l'achévement de ta routine, elles seront remise à "nil" (rien, vide), ca fait plus propre! Imagine que tu ais des variables stockant des listes de données énormes, si elles ne sont pas déclarées, elles vont rester présentes en mémoire pendant toutes la session de ton dessin. par exemple au message commande tapes !DIAMETRE la valeur te sera retourné même si ta routine est achevée. Pour peu que tu utilises (append ou (cons pour rajouter des éléments à une variable, et bien ta liste risque de s'allonger à chaque utilisation (et créer des bugs) Et puis lors de l'execution cela peut éviter des surprises: Tiens mon code que je suis en train de construire fonctionnait bien hier mais me retourne un message d'erreur aujourd'hui. Cause hier la variable était en mémoire pendant les tests aujourd'hui elle est à "nil" et cause un message ; erreur: type d'argument incorrect: numberp: nil par exemple. Mais il peut être interressant de garder une variable en mémoire pour éviter de demander celle-ci à chaque fois. Ex: (if (not diametre) (setq diametre (getdist))) Dans ce cas le diamètre te sera demandé lors de la 1ere utilisation de la routine, mais lors de nouvelles execution (pendant la même session) elle ne sera plus demandée. [Edité le 5/4/2006 par bonuscad]
  6. J'ai crée cette routine il y a déjà un bon petit bout de temps, son ancêtre avait débuté sur des version 9. Bien sur elle a évolué jusqu'aux versions 14-2000, depuis je l'utilise tel quelle (elle aurait besoin d'une révision) Je l'ai concu pour mes besoins (inverse aux tiens), c'était pour avoir un semis 3d dans des fichiers topo n'en possédant pas, ou ne correspondant pas a mes besoins (bloc avec attributs sous toutes forme incroyable que j'ai pu renconter dans les fichier topo que j'ai pu manipuler). Souvent je l'utilise conjointement avec la routine inverse (point dans fichiers) pour relire les points avec cette routine Donc mon but etait d'avoir des points 3D avec du texte simple. Ta demande de point 2D est cependant fondé et je suis d'accord avec tes arguments. La tendance du 3D filaire commence à emergé sur des plans topo suite aux commande exigé aux géomètre pour exploitation 3D en phase d'étude. Il y a une coche à enlever pour éviter l'insertion de l'altitude et/ou numéro :P La hauteur , elle est fonction de l'échelle choisie (un peu rigide, je reconnais mais reste dans le standard) Les altitudes sont déjà arrondies à 2 chiffres :o Je partage tout simplement, c'est mieux que de le garder jalousement au fond d'un tiroir. Et puis comme ça j'ai pas de service après-vente a assurer, je le fais si je veux Na! :P
  7. bonuscad

    Spline 3d

    Un truc vite fait mais pas forcément bien fait. Tu "Spline" ta polyligne 3D, après t'essayes la routine. Celle ci va mesurer la Spline 3d selon une distance de résolution que tu fournira, recupérer les point de mesures et les effacer. Puis avec cette liste de point reconstruire une polyligne 3d avec de nombreux sommets mais PAS spliné qui sera proche de la précédente. Avec celle-ci tu devrais pouvoir faire une extrusion. On pourra affiner les controles de la routine pour qu'elle s"execute le mieux possible (accroche objet , etc...) ((lambda ( / ) (setq js (ssget "_:S" '((0 . "POLYLINE")))) (setq last_e (entlast)) (setq x (getdist "\nLongueur de résolution: ")) (command "_measure" (ssname js 0) x) (setq dxf_ent (entget (setq ent (entnext borne))) l_pt '()) (while (and (= (cdr (assoc 0 (setq dxf_ent (entget (entlast))))) "POINT") (not (equal (entlast) last_e)) ) (setq l_pt (cons (cdr (assoc 10 dxf_ent)) l_pt)) (entdel (entlast)) ) (command "_.3dpoly") (foreach n l_pt (command n)) (command) ))
  8. Oui en effet, celle que cite Kallain a été publié sur ce site. :exclam: Je rappelle qu'elle est plus destinée à une présentation "Fun";quoique, une fois paramétrée est utlisée toujous à la même taille (utilisation d'@ pour la longueur de la flèche"). En effet elle s'auto-proportionne par rapport à sa taille. J'ai déjà vu plein de solutions pour des flèches. Un truc qui revient souvent et qui est peut être une bonne idée est l'utilisation d'une variable de cotation pour paramétrer l'épaisseur de la flèche. (encore faut-il faire de la cotation dans son dessin pour que ce soit fiable) J'ai bien essayer de faire quelque chose de "chiadé" avec (entmake), mais je bloque pour créer le code 210 (avec 2 points fournis en 3D), en fait placer cette poly2D directement dans son SCU objet. Je ne serais pas surpris que (gile) me donne la solution, c'est qu'il planche dessus le garçon ;)
  9. bonuscad

    Rotation complexe

    Bonjour, Tourne ton dessin normalement sans te préoccupé des textes. (Note ton angle de rotation que tu as appliqué) Ensuite essayes la routine suivante en fournissant l'angle précédent en changeant simplement le signe. Voilà j'espère que cela fonctionnera pour toi. (defun c:pivotext (/ jsel angplus nboucl txtmod nbelem ent rot nrot) (prompt "\nSélectionner les textes à faire pivoter sur leur point d'insertion: ") (setq jsel (ssget '((0 . "*TEXT")))) (if jsel (progn (initget 1) (setq angplus (getangle "\nAngle à rajouter pour faire pivoter les textes selectionnés: ") nbrtxtmod 0 nbrelemjs (sslength jsel) ) (while (< nbrtxtmod nbrelemjs) (setq ent (entget (ssname jsel nbrtxtmod)) rot (cdr(assoc 50 ent)) nrot (rem (+ rot angplus) (* 2 pi)) ent (subst (cons 50 nrot) (assoc 50 ent) ent) ) (entmod ent) (setq nbrtxtmod (1+ nbrtxtmod)) ) (terpri) (princ nbrtxtmod) (princ " ligne(s) de texte a (ont) tourné à ") (princ (angtos angplus)) ) ) (princ) )
  10. bonuscad

    choix de valeurs

    Je pense que tu devrais présenter ton code comme ceci. ((lambda...)) ne servait que pour le test. Et IMPORTANT, pense à déclarer tes variables en globale NB:Juste l'extrait essentiel (defun C:CERCE ( / DRT DESTRA SINISTRA SU GIU DIAG OSN DIAMETRE P0) ;....ET LES AUTRES ;insere les bloc de en H30V Triangulaire a former une cerce selon le diametre choisi (defun round_number (xr n / ) (* (fix (atof (rtos (* xr n) 2 0))) (/ 1.0 n)) ) (setq DTR (/ PI 180)) ;fattore di moltiplicazione x gradi verso radianti pi é Pi greco! (setq DESTRA (* 0 DTR)) ;traduzione del comando polar (setq SINISTRA (* 180 DTR)) ;traduzione del comando polar (setq SU (* 90 DTR)) ;traduzione del comando polar (setq GIU (* 270 DTR)) ;traduzione del comando polar (setq DIAG (* 45 DTR)) ;traduzione del comando polar x 45 gradi (SETQ OSN (GETVAR "OSMODE")) ;salva gli snap (SETVAR "OSMODE" 3) ;salva gli snap ;----------------------------- (initget 7) (setq DIAMETRE 60.0) (while (> DIAMETRE 16.0) (setq DIAMETRE (getdist "\Diametre?: ")) (setq DIAMETRE (round_number DIAMETRE (/ 1 0.5))) (if (> DIAMETRE 16.0) (progn (princ "\nDiametre trop importante, doit être inférieur à 16 maxi!") (initget 7) ) ) ) (setq P0 (getpoint "\nSelectionner un Point pour le Centre ? ")) (setvar "osmode" 0) ;________________________CONDITION POSSIBLES_____
  11. A cause de l'usage de (rem) exclusif au lisp je reprends les lignes de (gile). Je propose une autre syntaxe que j'aime bien et qui m'évite de me soucier des paramètres des angles Bien (angtos (getangle) (getvar "aunits") 14) fonctionne, il génère quand même une imprécision. En faisant comme ceci, pas d'imprécision et on se "fout" de "AUNITS" (command "_.text" "_justify" "_center" pause 0.08 "_none" (polar (getvar "LASTPOINT") (rem (getvar "SNAPANG") pi) 1.0) "Bureau" )
  12. bonuscad

    choix de valeurs

    Et ceci te conviendrais mieux? ((lambda ( / prec val) (defun round_number (xr n / ) (* (fix (atof (rtos (* xr n) 2 0))) (/ 1.0 n)) ) (setq prec (/ 1 0.5)) (initget 7) (setq val 60.0) (while (> val 55.0) (setq val (getdist "\nLargeur de la section?: ")) (setq val (round_number val prec)) (if (> val 55.0) (progn (princ "\nLargeur trop importante, doit être inférieur à 55 maxi!") (initget 7) ) ) ) (princ "\nLa largeur de la section est de ") (princ val) (prin1) )) Copie-colle directement en ligne de commande pour essayer NB:(setq prec (/ 1 0.5)) 0.5 représente la valeur d'arrondi que l'on souhaite, tu peut mettre 0.25 pour arondir à tous les quarts d'unité [Edité le 4/4/2006 par bonuscad]
  13. Hé oui, d'où l'importance d'être explicite sur ce que l'on veut obtenir, maintenant que l'on peut joindre plus facilement des images, ne pas hésiter. Un dessin vaut mieux qu'un long discours mal fichu :mad: Sans rancune ;) PS: Si j'ai un peu de temps, j'essayerais de réfléchir à cette disposition
  14. bonuscad

    choix de valeurs

    Vu le peu de nombre de valeur que tu as a proposer, je te conseille de passer par (getkword) En plus de cette manière tu pourras choisir directement ta valeur dans le menu contextuel (click-droit) ou valider la valeur par défaut proposée (ici 4.5, on peut en mettre une autre) Voici un exemple: ((lambda ( / old_shmnu val) (setq old_shmnu (getvar "SHORTCUTMENU")) (setvar "SHORTCUTMENU" 11) (initget "2 2.5 3 3.5 4 4.5 5 5.5") (setq val (getkword "\nValeur de la section du pont [2/2.5/3/3.5/4/4.5/5/5.5]? < 4.5 >: ")) (if (not val) (setq val 4.5) (setq val (atof val))) (setvar "SHORTCUTMENU" old_shmnu) (princ "\nLa largeur de la section est de ") (princ val) (prin1) ))
  15. Voici un 1er jus de ce que j'ai pu faire. (defun des_vec (lst col / lst_sg) (setq lst_sg (list (cadr lst) (car lst))) (setq lst (cdr lst)) (while lst (if (cadr lst) (setq lst_sg (cons (cadr lst) (cons (car lst) lst_sg))) (setq lst_sg (cons (last lst_sg) (cons (car lst) lst_sg))) ) (setq lst (cdr lst)) ) (setq lst_sg (cons col lst_sg)) (grvecs lst_sg) ) (defun c:cahier_bloc ( / old_osmd prefix pt_ins pt_tmp lst_dwg n dx dy loop key pt pt_last obj ll ur lg) (setvar "cmdecho" 0) (setvar "attreq" 0) (setq old_osmd (getvar "osmode")) (setvar "osmode" 0) (vl-load-com) (setq prefix (strcat (vl-filename-directory (getfiled "Sélectionner un fichier DWG TEMOIN" "" "dwg" 16)) "\\")) (setq pt_ins (getpoint "\nPoint d'insertion pour le 1er Bloc? <0.0,0.0,0.0>: ")) (if (null pt_ins) (setq pt_ins '(0.0 0.0 0.0))) (setq pt_tmp pt_ins lst_dwg (vl-directory-files prefix "*.dwg" 1)) (setq n (length lst_dwg)) (initget "A4 A3") (setq dx (if (eq (getkword "\nQuel format [A4/A3]? < A4 >: ") "A3") 420.0 210.0) dy (* 210.0 (sqrt 2)) loop T) (command "_.zoom" "_window" pt_ins (list (* dx n) (* dy n))) (while (and (setq key (grread T 4 0)) (/= (car key) 3) loop) (cond ((eq (car key) 5) (setq pt (cadr key)) (redraw) (repeat n (des_vec (list (list (car pt_ins) (cadr pt_ins)) (list (+ (car pt_ins) dx) (cadr pt_ins)) (list (+ (car pt_ins) dx) (+ (cadr pt_ins) dy)) (list (car pt_ins) (+ (cadr pt_ins) dy)) ) 3 ) (if (> (car pt) (car pt_ins)) (setq pt_ins (list (+ (car pt_ins) dx) (cadr pt_ins))) (setq pt_ins (list 0.0 (+ (cadr pt_ins) dy))) ) ) (setq pt_ins pt_tmp pt_last pt) ) ((or (member key '((2 13) (2 32))) (eq (car key) 25)) (setq loop nil) (repeat n (command "_.rectang" (list (car pt_ins) (cadr pt_ins)) (list (+ (car pt_ins) dx) (+ (cadr pt_ins) dy))) (if (> (car pt_last) (car pt_ins)) (setq pt_ins (list (+ (car pt_ins) dx) (cadr pt_ins))) (setq pt_ins (list (car pt_tmp) (+ (cadr pt_ins) dy))) ) ) ) ) ) (redraw) (foreach dwg lst_dwg (setq Obj (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (mapcar '/ (mapcar '+ (list (car pt_ins) (cadr pt_ins)) (list (+ (car pt_ins) dx) (+ (cadr pt_ins) dy))) '(2.0 2.0))) (strcat prefix dwg) 1 1 1 0 ) ) (vla-GetBoundingBox Obj 'll 'ur) (setq ll (safearray-value ll)) (setq ur (safearray-value ur)) (command "_.rectang" (list (car pt_ins) (cadr pt_ins)) (list (+ (car pt_ins) dx) (+ (cadr pt_ins) dy))) (command "_.text" "_justify" "_tleft" (list (car pt_ins) (+ (cadr pt_ins) dy)) "5.0" "0.0" dwg) (if (> (car pt) (car pt_ins)) (setq pt_ins (list (+ (car pt_ins) dx) (cadr pt_ins))) (setq pt_ins (list 0.0 (+ (cadr pt_ins) dy))) ) ) (command "_.zoom" "_all") (command "_.zoom" "_extents") (setvar "osmode" old_osmd) (setvar "attreq" 1) (setvar "cmdecho" 1) (prin1) )
  16. bonuscad

    logiciel de signalisation routière

    Il y avait ce SUJET Mais je crois que le lien donné n'était pas bon, je pense qu'il vaudrait mieux allez voir ICI Je ne sais pas ce que contient exactement cette bibliothèque, mais pour compléter....
  17. Si le drapeau 66 est à 1, c'est que le bloc posséde un ou plusieurs attributs Si à 0, le bloc ne possède aucun attribut.
  18. Non pas constant, mais calculé sur l'encombrement du bloc. Ce que tu demande est, je pense, réalisable mais cela demande un développement plus approfondi (donc du temps) Un problème se pose par rapport a ton format imposé, c'est l'échelle d'insertion du bloc. Il se peut très bien que le bloc une fois inséré dépasse de ton format imposé. Si l'échelle n'a pas d'importance, on peut envisager une insertion ajustée à la page. J'espère que tu concois que ça devient vraiment une demande, bien qu' interressante, qui demande pas mal d'investissement pour un programmeur. Personnelement je suis pas "très chaud" pour réaliser ceci. D'autant plus qu'il est plus judicieux de ce créer un menu bibliothéque ou l'insertion pourrait se faire à travers des clichés contenus dans une boite de dialogue. On voit ce qu'on insère.... Par contre on peut envisager d'automatiser la création des clichés du dossier bibliothéque. Sur ce point je pourrais te donner un coup de main je pense.
  19. En lisp: Tout les blocs du dessin avec des attributs (ssget "_X" '((0 . "INSERT") (66 . 1))) Tu peux affiner le filtre en rajoutant dans la liste: (8 . "Nom du calque") (2 . "Nom du bloc") (67 . 0/1) 0=espace objety 1=espace papier ..... Si tu veux seulement un attribut particulier, cela est un peu plus complexe car il faudra parcourir les blocs pour examiner les étiquettes des attributs.
  20. bonuscad

    probleme avec booleens

    Là, j'avoue, je suis un peu "largué" Je n'ai guère de connaissance géomètrique dans ces genres volumes, donc j'ai du être à côté de la plaque. :calim: Merci en tout cas de vos précisions et de vos explications sur les cônes
  21. bonuscad

    IMPORTANT plus d\'Autolisp

    Tu voulais me faire mordre à l'hameçon Tramber, et que je deviennes tout blanc. Mais comme Winfield, je n'y ai pas cru (t'as mis aucun lien pour l'info!) Bien tenté quand même, j'ai failli rigoler jaune ;)
  22. Si tu veux concevoir des routines, le lisp ou vba te seras plus utile que le diesel, bien que ce dernier soit fort utile pour ceux qui utilise les versions LT. Avec les autres languages tu auras plus de controle sur l'execution et surtout sur les abandons de commandes qui te permettra de restorer l'etat d'autocad avant l'appel de la routine si celle-ci a été inachevée "Echap" Tu es aussi très vite limité avec le diesel pour concevoir des actions sophistiquées, et pas toujours simple à mettre en oeuvre. Je trouve aussi parfois qu'il a un comportement inexplicable. Si tous le monde dans ton boulot utilise des versions pleines conçois plutôt avec le lisp ou vba. Mais le diesel peut rendre fort service pour des actions relativement simples. Le plus dur est de démarrer, après quand on voit toutes les possibilités qui s'offrent, ca motive ;)
  23. La solution de Pieroka, mais automatisé (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 "") ) (command "_oops") (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 "_.-purge" "_block" "cpalg$" "_no") (command "_.undo" "_end") ) ) (princ) )
  24. Le mieux est de placé ton fichier lisp dans un dossier de recherche d'autocad (ou d'en créer un nouveau), ça simplifie la syntaxe! Il te resteras à modifier ton bouton comme suit: ^C^C(if (not c:nivc) (load "nivc")) nivc NB: j'ai supposé que le nom du fichier a le même nom que la fonction qu'il contient.
  25. Essayes sous cette forme, fait attention au copier-coller (supprime les éventuels espace qui se seraient rajoutés) ^C^C_.ucs;_view;_.-style;Piece;simplex.shx;0;0.9;20;;;;_.-mtext;\_style;Piece;_height;0.08;_rotation;0;@;Cuisine;;_.ucs;_previous;^Z
×
×
  • 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é