Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

J'aurais besoin de vos conseils, pour récupérer les coordonnées du pointeur puis tracer une ligne - en temps réel.

Mon objectif : reproduire le comportement de la fonction "LIGNE" ou "POLYLIGN" en AutoLISP. Soit "tirer" la ligne (après définition du premier point, tracer une ligne entre le premier et le curseur en temps réel, puis figer la ligne une fois le deuxième point posé).

 

J'essaye d'utiliser les fonctions GRREAD et LIGNE, mais sans succès. Voilà mon échec :

(setq xe '((0 0 0)))
(while (/= (car (setq x (grread T))) 25) ; tant que pas clic droit
 (cond
   ((= (car x) 5) ; Si pointeur sans clic gauche
    (command "LIGN" (car xe) x ""))
   ((= (car x) 3) ; Si pointeur avec clic gauche
    (setq xe (cons (cadr x) xe)))))

 

Avez-vous une idée ?

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

Posté(e)

Bon bah je me réponds à moi-même, je viens de trouver une solution :

;; Dessin d'une ligne en temps réel
(setq xe '((0 0 0)))
(while (/= (car (setq x (grread T))) 25)
 (cond
   ((= (car x) 5)
    (redraw)
    (grdraw (car xe) (cadr x) -1))
   ((= (car x) 3)
    (setq xe (cons (cadr x) xe))
    (redraw)
    (command "LIGNE" (cadr xe) (car xe) ""))))

 

Qu'en pensez-vous ?

Patrick_35, de ce que j'ai compris la fonction pause redonne la main à l'utilisateur. Ce n'est pas exactement ce que je recherche, vu que l'utilisateur n'est pas censé faire d'autres entrées que celle du curseur. Mais j'y ai appris des choses qui pourraient me servir plus tard.

 

 

Maintenant, je cherche à faire la même chose, mais avec un arc...

 

Temporairement je l'ai fait avec un cercle, mais ça saccade

 

;; Dessin d'un cercle en temps réel
(setq xe nil)
(while (/= (car (setq x (grread T))) 25)
 (cond
   ((= (car x) 5)
    (redraw)
    (command "CERCLE" (cadr x) 10 ""))
   ((= (car x) 3)
    (setq xe (cons (cadr x) xe))
    (redraw)
    (command "CERCLE" (car xe) 10 ""))))

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

Posté(e)

Salut,

 

Pour t'inspirer, un bout de code pour tracer un arc virtuel par 3 points.

Cela ce comporte comme la commande arc, mais aucun objet n'est créé.

 

((lambda ( / p1 p2 ll pt_m px1 px2 key p3 px3 px4 pt_cen rad inc ang nm lst_pt pa1 pa2)
 (initget 9)
 (setq p1 (getpoint "\nSpécifiez le point de départ de l'arc: "))
 (initget 9)
 (setq p2 (getpoint p1 "\nSpécifiez le second point de l'arc: "))
 (setq
   ll (list p1 p2)
   pt_m
   (mapcar
     '/
     (list
       (apply '+ (mapcar 'car ll))
       (apply '+ (mapcar 'cadr ll))
       (apply '+ (mapcar 'caddr ll))
     )
     '(2.0 2.0 2.0)
   )
   px1 (polar pt_m (+ (angle p1 p2) (* pi 0.5)) (distance p1 p2))
   px2 (polar pt_m (- (angle p1 p2) (* pi 0.5)) (distance p1 p2))
 )
 (princ "\nSpécifiez l'extrémité de l'arc: ")
 (while (and (setq key (grread T 4 0)) (/= (car key) 3))
   (cond
     ((eq (car key) 5)
       (redraw)
       (setq
         p3 (cadr key)
         ll (list p1 p3)
         pt_m
         (mapcar
           '/
           (list
             (apply '+ (mapcar 'car ll))
             (apply '+ (mapcar 'cadr ll))
             (apply '+ (mapcar 'caddr ll))
           )
           '(2.0 2.0 2.0)
         )
         px3 (polar pt_m (+ (angle p1 p3) (* pi 0.5)) (distance p1 p3))
         px4 (polar pt_m (- (angle p1 p3) (* pi 0.5)) (distance p1 p3))
         pt_cen (inters px1 px2 px3 px4 nil)
       )
       (cond
         (pt_cen
           (setq 
             rad (distance pt_cen p3)
             inc (angle pt_cen p1)
             ang (+ (* 2.0 pi) (angle pt_cen p3))
             nm (fix (/ (rem (- ang inc) (* 2.0 pi)) (/ (* pi 2.0) 36.0)))
             lst_pt '()
           )
           (if (zerop nm) (setq nm 1))
           (repeat nm
             (setq
               pa1 (polar pt_cen inc rad)
               inc (+ inc (/ (* pi 2.0) 36.0))
               pa2 (polar pt_cen inc rad)
               lst_pt (append lst_pt (list pa1 pa2))
             )
           )
           (setq lst_pt (append lst_pt (list pa2 p3)))
           (grvecs lst_pt)
         )
       )
     )
   )
 )
 (prin1)
))

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci bonuscad. Si j'ai bien compris, l'arc est discrétisé / approximé par de petits segments ? La fonction grvecs permet de les tracer.

Je vais regarder ça de prêt, j'ai bien l'impression que la fonction ARC ou une fonction type grvecs / grdraw ne permette pas de tracer en temps réel un arc.

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

Posté(e)

Je vais regarder ça de prêt, j'ai bien l'impression que la fonction ARC ou une fonction type grvecs / grdraw ne permette pas de tracer en temps réel un arc.

C'est très clair ; que des segments.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut,

 

je l'ai fait avec un cercle, mais ça saccade

 

La fonction command est (très) lente, on peut essayer avec vl-cmdf qui est un petit peu plus rapide ou avec command-s (2013+) qui est plus rapide.

 

Mais, par expérience, je trouve qu'on a de bon résultats avec grread en utilisant entmod.

 

((lambda (/ c r e)
  (setq c (entmakex '((0 . "circle") (10 0 0 0) (40 . 10))))
  (while (/= 3 (car (setq r (grread T 4 0))))
    (setq e (entget c))
    (entmod (subst (cons 10 (cadr r)) (assoc 10 e) e)))))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Allez, je suis dans un bon jour, une commande pour faire de ronds, pleins de ronds.

 

(defun c:FaireDesRonds  (/ *error* c r e)
 (defun *error*  (msg)
   (and c (entdel c))
   (princ))
 
 (setq c (entmakex '((0 . "circle") (10 0 0 0) (40 . 10))))
 (while (/= 25 (car (setq r (grread T 4 0))))
   (setq e (entget c))
   (cond
     ((= 5 (car r))
      (entmod (subst (cons 10 (cadr r)) (assoc 10 e) e)))
     ((= 3 (car r))
      (setq c (entmakex '((0 . "circle") (10 0 0 0) (40 . 10)))))))
 (*error* nil))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci Tramber, au moins je suis fixé.

Et un grand merci Gile. Je travaille avec ton document "Introduction à AutoLISP" depuis 6 mois, pour concevoir mon outil (je partais de 0 en AutoLISP). Et tu viens de porter mon regard sur les derniers paragraphes que je n'avais pas lu.

 

Pour revenir à ma problématique, je pense m'inspirer de ton premier post : créer un arc, puis modifier ses données DXF en temps réel.

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

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é