Karmelie Posté(e) le 6 juillet 2011 Posté(e) le 6 juillet 2011 Bonjour, Je dois placer des points dans un dessin selon la méthode suivante:Chaque point est en relation avec 2 autres points connus, par uniquement 2 distances. Un peu comme un relevé terrain qui nous dirait que l'arbre 1 est à une distance 1.5 de la station A et à une distance 5.6 de la station B. Je n'ai que des distances, pas d'angle. Est-ce qu'il y a un automatisme quelconque de déjà créé (ou que qqc pourrait créer) qui demanderait par exemple: Piquer la station A…Piquer la station B …Distance du point A ?Distance du point B ?Distance du point A ?Distance du point B ? Tant que les stations A et B ne changent pas je n'aurais pas besoin de piquer les points A et B. Merci à l'avance Karmélie
x_all Posté(e) le 7 juillet 2011 Posté(e) le 7 juillet 2011 la commande cercle? tu prend la poignée et tu tappe: c espace ton rayon espace ,pour faire des copies avec le même centre... oui je sais, c'est un peu juste... et il faut chercher les intersections à la main... quelques trucs sur autocad
didier Posté(e) le 7 juillet 2011 Posté(e) le 7 juillet 2011 coucou tu as donc DEUX solutionscomment choisiras-tu la bonne ? on peut te faire un lisp, mais est-ce que ça t'intéresse ? amicalement [Edité le 7/7/2011 par didier] Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 7 juillet 2011 Posté(e) le 7 juillet 2011 Bonjour, Essayes cet outil en lisp. Je pense qu'il pourra te simplifier la tâche Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Karmelie Posté(e) le 7 juillet 2011 Auteur Posté(e) le 7 juillet 2011 Bonjour, Merci X_all. Je peux trouver l'intersection entre 2 cercles, mais je veux quelque chose de plus "automatique". j'ai beaucoup de positionnement à faire de cette façon. Didier: Et comment donc! Bonuscad, ton outil est un très bon début (c'est presque gènant d'écrire ça en voyant le lisp!). Ne pourrait-on pas 1) Supprimer les lignes qui se dessinent et faire insérer un bloc à l'intersection des 2 rayons?2) Réactiver automatiquement la demande de distances afin de positionner d'autres points à partir des 2 mêmes points de base. Merci
bonuscad Posté(e) le 7 juillet 2011 Posté(e) le 7 juillet 2011 La version adaptée à tes 2 demandes (defun 2xderr (ch) (cond ((eq ch "Function cancelled") nil) ((eq ch "quit / exit abort") nil) ((eq ch "console break") nil) (T (princ ch)) ) (setvar "cmdecho" v1) (setvar "orthomode" v2) (setvar "osmode" v3) (setvar "blipmode" v4) (setvar "plinewid" v5) (setq *error* olderr) (princ) ) (defun c:2xd ( / v1 v2 v3 v4 v5 nam_blk cc1 r1 cc2 r2 dce xi yi i cr1 cr2 vi xt yt h1 h2 h i1 i2 ss1 ss2 key e_name olderr) (setq v1 (getvar "cmdecho") v2 (getvar "orthomode") v3 (getvar "osmode") v4 (getvar "blipmode") v5 (getvar "plinewid") ) (setvar "cmdecho" 0) (setvar "orthomode" 0) (setvar "blipmode" 0) (setvar "plinewid" 0) (setq olderr *error* *error* 2xderr) (while (not (tblsearch "BLOCK" (setq nam_blk (getstring T "\nNom du bloc à insérer ?: "))))) (initget 9) (setq cc1 (getpoint "\nPremier point de base ?: ")) (initget 9) (setq cc2 (getpoint cc1 "\nDeuxième point de base ?: ")) (grdraw cc1 cc2 1) (initget 38) (while (setq r1 (getdist cc1 "\nDonnez la 1ère distance rayonnante : ")) (initget 39) (setq r2 (getdist cc2 "\nDonnez la 2ème distance rayonnante : ")) (grdraw cc1 cc2 0) (setvar "osmode" 0) (setq dce (distance cc1 cc2)) (if (= (rtos (/ dce (+ r1 r2)) 2 12) "1.000000000000") (progn (setq xi (/ (+ (* r2 (car cc1)) (* r1 (car cc2))) dce) yi (/ (+ (* r2 (cadr cc1)) (* r1 (cadr cc2))) dce)) (setq i (cons xi (cons yi '(0.0)))) ) (if (and (not (zerop (- r1 r2))) (= (rtos (/ dce (abs (- r1 r2))) 2 12) "1.000000000000")) (progn (if (= r1 (max r1 r2)) (setq cr1 cc1 cr2 cc2) (setq cr1 cc2 cr2 cc1) ) (setq xi (/ (- (* (max r1 r2) (car cr2)) (* (min r1 r2) (car cr1))) dce) yi (/ (- (* (max r1 r2) (cadr cr2)) (* (min r1 r2) (cadr cr1))) dce)) (setq i (cons xi (cons yi '(0.0)))) ) (progn (if (or (> dce (+ r1 r2)) (< (+ (min r1 r2) dce) (max r1 r2))) (prompt "\nPas d'intersection !...") (progn (setq vi (angle cc1 cc2)) (if (> r1 r2) (setq xt (- (/ (* (+ r1 dce r2) (- (+ r1 dce) r2)) (* 2 dce)) r1) yt (- dce xt) h1 (sqrt (- (expt r1 2) (expt xt 2))) h2 (sqrt (- (expt r2 2) (expt yt 2))) xi (/ (+ (* yt (car cc1)) (* xt (car cc2))) dce) yi (/ (+ (* yt (cadr cc1)) (* xt (cadr cc2))) dce) ) (setq xt (- (/ (* (+ r2 dce r1) (- (+ r2 dce) r1)) (* 2 dce)) r2) yt (- dce xt) h1 (sqrt (- (expt r2 2) (expt xt 2))) h2 (sqrt (- (expt r1 2) (expt yt 2))) xi (/ (+ (* xt (car cc1)) (* yt (car cc2))) dce) yi (/ (+ (* xt (cadr cc1)) (* yt (cadr cc2))) dce) ) ) (setq h (/ (+ h1 h2) 2) i1 (polar (cons xi (cons yi '(0.0))) (+ vi (/ pi 2)) h) i2 (polar (cons xi (cons yi '(0.0))) (- vi (/ pi 2)) h) ) (if (zerop (getvar "PICKFIRST")) (setvar "PICKFIRST" 1)) (command "_.insert" nam_blk i1 "" "" "") (setq ss1 (ssget "_L")) (command "_.insert" nam_blk i2 "" "" "") (setq ss2 (ssget "_L")) (if (and ss1 ss2 (= 0 (getvar "CMDACTIVE"))) (progn (sssetfirst nil ss2) (princ "\n pour choix; /[Espace]/Click+droit pour finir!.") (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25)) (cond ((eq (car key) 5) (if (< (distance i1 (cadr key)) (distance i2 (cadr key))) (setq e_name (ssname (cadr (sssetfirst nil ss1)) 0)) (setq e_name (ssname (cadr (sssetfirst nil ss2)) 0)) ) ) ) ) (entdel e_name) ) ) ) ) ) ) ) (grdraw cc1 cc2 1) (initget 38) ) (redraw) (setvar "cmdecho" v1) (setvar "orthomode" v2) (setvar "osmode" v3) (setvar "blipmode" v4) (setvar "plinewid" v5) (setq *error* olderr) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Karmelie Posté(e) le 8 juillet 2011 Auteur Posté(e) le 8 juillet 2011 Bonjour Bonuscad, C'est presque parfait! Pour étirer l'élastique, serait-il possible lors de l'insertion du bloc, soit de demander le nom, soit permettre à l'usager de piquer un bloc existant, soit de faire afficher la boîte de dialogue d'insertion de blocs. Merci encore
bonuscad Posté(e) le 21 juillet 2011 Posté(e) le 21 juillet 2011 serait-il possible lors de l'insertion du bloc, soit de demander le nom, soit permettre à l'usager de piquer un bloc existant, soit de faire afficher la boîte de dialogue d'insertion de blocs. Sur la page de (gile) tu as la fonction Getblock (pourquoi réécrire du code qui fonctionne bien) ;) , qui est facile à inclure dans le code. ce qui donnerait en faisant l'assemblage: ;;; Getblock (gile) 03/11/07 ;;; Retourne le nom du bloc entré ou choisi par l'utilisateur ;;; dans une liste déroulante de la boite de dialogue ou depuis la boite ;;; de dialogue standard d'AutoCAD ;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc") (defun getblock (titre / bloc n lst tmp file what_next dcl_id nom) (while (setq bloc (tblnext "BLOCK" (not bloc))) (setq lst (cons (cdr (assoc 2 bloc)) lst) ) ) (setq lst (acad_strlsort (vl-remove-if (function (lambda (n) (= (substr n 1 1) "*"))) lst ) ) tmp (vl-filename-mktemp "Tmp.dcl") file (open tmp "w") ) (write-line (strcat "getblock:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir un bloc\"") ) ";initial_focus=\"bl\";:boxed_column{ :row{:text{label=\"Sélectionner\";alignment=left;} :button{label=\">>\";key=\"sel\";alignment=right;fixed_width=true;}} spacer; :column{:button{label=\"Parcourir...\";key=\"wbl\";alignment=right;fixed_width=true;}} :column{:text{label=\"Nom :\";alignment=left;}} :edit_box{key=\"tp\";edit_width=25;} :popup_list{key=\"bl\";edit_width=25;}spacer;} spacer; ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (setq what_next 2) (while (>= what_next 2) (if (not (new_dialog "getblock" dcl_id)) (exit) ) (start_list "bl") (mapcar 'add_list lst) (end_list) (if (setq n (vl-position (strcase (getvar "INSNAME")) (mapcar 'strcase lst) ) ) (setq nom (nth n lst)) (setq nom (car lst) n 0 ) ) (set_tile "bl" (itoa n)) (action_tile "sel" "(done_dialog 5)") (action_tile "bl" "(setq nom (nth (atoi $value) lst))") (action_tile "wbl" "(done_dialog 3)") (action_tile "tp" "(setq nom $value) (done_dialog 4)") (action_tile "accept" "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)" ) (setq what_next (start_dialog)) (cond ((= what_next 3) (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0)) (setq what_next 1) (setq what_next 2) ) ) ((= what_next 4) (cond ((not (read nom)) (setq what_next 2) ) ((tblsearch "BLOCK" nom) (setq what_next 1) ) ((findfile (setq nom (strcat nom ".dwg"))) (setq what_next 1) ) (T (alert (strcat "Le fichier \"" nom "\" est introuvable.")) (setq nom nil what_next 2 ) ) ) ) ((= what_next 5) (if (and (setq ent (car (entsel))) (= "INSERT" (cdr (assoc 0 (entget ent)))) ) (setq nom (cdr (assoc 2 (entget ent))) what_next 1 ) (setq what_next 2) ) ) ((= what_next 0) (setq nom nil) ) ) ) (unload_dialog dcl_id) (vl-file-delete tmp) nom ) (defun 2xderr (ch) (cond ((eq ch "Function cancelled") nil) ((eq ch "quit / exit abort") nil) ((eq ch "console break") nil) (T (princ ch)) ) (setvar "cmdecho" v1) (setvar "orthomode" v2) (setvar "osmode" v3) (setvar "blipmode" v4) (setvar "plinewid" v5) (setq *error* olderr) (princ) ) (defun c:2xd ( / v1 v2 v3 v4 v5 nam_blk cc1 r1 cc2 r2 dce xi yi i cr1 cr2 vi xt yt h1 h2 h i1 i2 ss1 ss2 key e_name olderr) (setq v1 (getvar "cmdecho") v2 (getvar "orthomode") v3 (getvar "osmode") v4 (getvar "blipmode") v5 (getvar "plinewid") ) (setvar "cmdecho" 0) (setvar "orthomode" 0) (setvar "blipmode" 0) (setvar "plinewid" 0) (setq olderr *error* *error* 2xderr) (initget 9) (setq cc1 (getpoint "\nPremier point de base ?: ")) (initget 9) (setq cc2 (getpoint cc1 "\nDeuxième point de base ?: ")) (grdraw cc1 cc2 1) (initget 38) (while (setq r1 (getdist cc1 "\nDonnez la 1ère distance rayonnante : ")) (initget 39) (setq r2 (getdist cc2 "\nDonnez la 2ème distance rayonnante : ")) (while (not (setq nam_blk (getblock nil)))) (grdraw cc1 cc2 0) (setvar "osmode" 0) (setq dce (distance cc1 cc2)) (if (= (rtos (/ dce (+ r1 r2)) 2 12) "1.000000000000") (progn (setq xi (/ (+ (* r2 (car cc1)) (* r1 (car cc2))) dce) yi (/ (+ (* r2 (cadr cc1)) (* r1 (cadr cc2))) dce)) (setq i (cons xi (cons yi '(0.0)))) ) (if (and (not (zerop (- r1 r2))) (= (rtos (/ dce (abs (- r1 r2))) 2 12) "1.000000000000")) (progn (if (= r1 (max r1 r2)) (setq cr1 cc1 cr2 cc2) (setq cr1 cc2 cr2 cc1) ) (setq xi (/ (- (* (max r1 r2) (car cr2)) (* (min r1 r2) (car cr1))) dce) yi (/ (- (* (max r1 r2) (cadr cr2)) (* (min r1 r2) (cadr cr1))) dce)) (setq i (cons xi (cons yi '(0.0)))) ) (progn (if (or (> dce (+ r1 r2)) (< (+ (min r1 r2) dce) (max r1 r2))) (prompt "\nPas d'intersection !...") (progn (setq vi (angle cc1 cc2)) (if (> r1 r2) (setq xt (- (/ (* (+ r1 dce r2) (- (+ r1 dce) r2)) (* 2 dce)) r1) yt (- dce xt) h1 (sqrt (- (expt r1 2) (expt xt 2))) h2 (sqrt (- (expt r2 2) (expt yt 2))) xi (/ (+ (* yt (car cc1)) (* xt (car cc2))) dce) yi (/ (+ (* yt (cadr cc1)) (* xt (cadr cc2))) dce) ) (setq xt (- (/ (* (+ r2 dce r1) (- (+ r2 dce) r1)) (* 2 dce)) r2) yt (- dce xt) h1 (sqrt (- (expt r2 2) (expt xt 2))) h2 (sqrt (- (expt r1 2) (expt yt 2))) xi (/ (+ (* xt (car cc1)) (* yt (car cc2))) dce) yi (/ (+ (* xt (cadr cc1)) (* yt (cadr cc2))) dce) ) ) (setq h (/ (+ h1 h2) 2) i1 (polar (cons xi (cons yi '(0.0))) (+ vi (/ pi 2)) h) i2 (polar (cons xi (cons yi '(0.0))) (- vi (/ pi 2)) h) ) (if (zerop (getvar "PICKFIRST")) (setvar "PICKFIRST" 1)) (command "_.insert" nam_blk i1 "" "" "") (setq ss1 (ssget "_L")) (command "_.insert" nam_blk i2 "" "" "") (setq ss2 (ssget "_L")) (if (and ss1 ss2 (= 0 (getvar "CMDACTIVE"))) (progn (sssetfirst nil ss2) (princ "\n pour choix; /[Espace]/Click+droit pour finir!.") (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25)) (cond ((eq (car key) 5) (if (< (distance i1 (cadr key)) (distance i2 (cadr key))) (setq e_name (ssname (cadr (sssetfirst nil ss1)) 0)) (setq e_name (ssname (cadr (sssetfirst nil ss2)) 0)) ) ) ) ) (entdel e_name) ) ) ) ) ) ) ) (grdraw cc1 cc2 1) (initget 38) ) (redraw) (setvar "cmdecho" v1) (setvar "orthomode" v2) (setvar "osmode" v3) (setvar "blipmode" v4) (setvar "plinewid" v5) (setq *error* olderr) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Karmelie Posté(e) le 22 juillet 2011 Auteur Posté(e) le 22 juillet 2011 En effet, pourquoi réécrire du code.... Même avec tous les codes, je n'aurais pas su les agencer. ;) Merci beaucoup, ça correspond exactement à mes attentes. Karmélie
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