Aller au contenu

Placer un point avec 2 distances


Messages recommandés

Posté(e)

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

 

Posté(e)

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

Posté(e)

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

Posté(e)

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

  • 2 semaines après...
Posté(e)

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

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é