Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

C'est surement très simple mais je suis à cours d'idée!!

J'aimerais que mon programme trace le premier point du polyligne, fixe l'angle de la droite et à l'utilisateur de cliquer ou il souhaite le deuxième point de la polyligne mais situer sur la doite.

 

comme cela :

(defun c:hh ()
 (command "polylign"
   '(0 0 0)
   (getpoint "\cliquez")
   ""
 )
)

 

Sauf que l'angle est bloqué.

 

merci

Posté(e)

coucou

 

c'est sans doute très simple ...

sauf que je ne comprends pas...

tu pars du point 0,0,0 c'est normal ou bien tu veux partir d'un point cliqué par l'utilisateur, (c'est rare de partir du zéro)

ensuite tu dis que l'angle est bloqué, soit !

mais quel angle ?

 

merci de ton complément d'information pour t'aider efficacement.

 

amicalement

Posté(e)

Salut,

Je suppose que Clément souhaite un comportement similaire aux commandes suivantes :

Commande: _pline

Spécifiez le point de départ: 0,0,0

La largeur courante est de 0.0000.
Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: <20
Remplacer angle: 20.00



Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]:

 

Je n'arrive pas à obtenir ce résultat en programmation mais je suis intéressé par la réponse.

Pour le point 0,0,0 je suppose c'est un exemple le but étant de partir d'un point donné par le programme ?

 

Espérant avoir aidé.

Olivier

Posté(e)

Bonjour à tous,

 

C'est exactement ce que je veux faire -Olivier- et le point 0,0,0 est un exemple le but est bien de partir d'un point donné par le programme.

 

en passant je connaissait pas ça :

Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: <20

Voila si quelqu'un c'est comment y parvenir?

Posté(e)

Il conviendra de clarifier la distance au point de départ que tu veux, si c'est une projection ou la distance de l'élastique.

Ensuite, ça n'est que du calcul de point.

 

Il y a aussi l'interaction autolisp pour la création de la poly. Un (tellement) vieux sujet !

Voir la réponse du (tellement) grand Didier.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

je vois pas ou tu veux en venir fredboss.

Je me réexplique car je l'impression que vous m'avez pas très bien suivit.

 

j'aimerais que le programme fasse ça tout seul :

Commande: _pline

Spécifiez le point de départ: 0,0,0

La largeur courante est de 0.0000.
Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: <20
Remplacer angle: 20.00

et ensuite à l'utilisateur de cliquez le deuxième point bloqué sur la droite à 20°.

Le point 0,0,0 et l'angle 20° sont pour l'exemple ces deux valeurs seront des variables calculé prélablement par le programme.

Posté(e)

J'ai pas trouver ce que je voulais dans ta réponse Tramber.

Je veux pas que l'utilisateur entre une distnace mais bien un point se situant sur la droite élastique former par le premier point et l'angle;

Posté(e)

J'avais oublier de préciser qu'il fallait aussi activer le mode ortho.

pourquoi ne pas simplement placer le scu au point voulu, avec l'angle voulu, puis (command "polylign" '(0 0 0) pause "" )

ce qui fera exactement ce que tu veux.

Posté(e)

Oui mais l'utilisateur pourra aussi cliqué à +90° et même si dans le contexte sa ne serai pas logique du tout je préfere pas prendre le risque! Parfois les utilisateur font des truc bizzard :unsure:

Posté(e)

Bonjour,

 

C'est un truc comme cela que tu voudrais?

 

((lambda ( / po ang d)
(setq po (getpoint "\nPoint de départ: "))
(setq ang (getangle po "\nOrientation de la polyligne: "))
(command "_.pline" po "_width" 0.0 0.0)
(while (setq d (getdist (getvar "LASTPOINT") "\nDistance: "))
	(command (polar (getvar "LASTPOINT") ang d))
)
(command "")
))

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

Posté(e)

Salut,

 

Je pense que ce que tu cherches à faire est possible avec la fonction grread.

 

Un exemple avec une fonction qui utilise grread pour dessiner une ligne à partir d'un point et d'un vecteur directeur que j'avais écrite pour d'autres besoins.

L'utilisateur est invité à spécifier la distance depuis le point de départ au clavier ou avec le curseur.

L'exemple n'est peut-être pas très simple à comprendre parce que la fonction est définie pour être utilisée quel que soient le SCU courant et la vue courante (3d).

 

;; gc:grDrawLine (gile)
;; Utilisation de grread pour dessiner une ligne à partir d'un point et
;; d'un vecteur directeur
;;
;; Arguments
;; startPt : point de départ de la ligne (coordonnées SCG)
;; direction : vecteur directeur de la ligne (coordonnées SCG)

(defun gc:grDrawLine (startPt direction / dist pt ratio line elst loop)
 (if (/= 0
  (setq	dist (distance (gc:UCSProjectAboutView '(0 0 0))
		       (gc:UCSProjectAboutView direction)
	     )
  )
     )
   (progn
     (setq
;; projection du point sur le plan du SCU
pt    (trans (gc:UCSProjectAboutView startPt) 0 1)

;; rapport entre la longueur du vecteur et celle de sa projection sur le SCU
ratio (/ 1 dist)
;; ligne de longueur 0
line  (entmakex
	(list
	  '(0 . "LINE")
	  (cons 10 startPt)
	  (cons 11 startPt)
	)
      )
elst  (entget line)
loop  T
     )
     (princ "\nSpécifiez la longueur ou [annUler]: ")

     (if
(vl-catch-all-error-p
  (vl-catch-all-apply
    '(lambda (/ gr len end str)
       (while
	 (and (setq gr (grread T 12 0)) (/= (car gr) 3) loop)
	  (cond
	    ;; modification de la ligne en fonction de la position du pointeur
	    ((= 5 (car gr))
	     (if (minusp
		   (gc:DotProduct
		     (gc:3dTo2dPoint (trans direction 0 2 T))
		     (gc:3dTo2dPoint (trans (mapcar '- (cadr gr) pt) 1 2 T))
		   )
		 )
	       (setq direction (mapcar '- direction))
	     )
	     (setq len (* ratio (distance pt (cadr gr)))
		   end (mapcar
			 (function
			   (lambda (x1 x2)
			     (+ x1 (* len x2))
			   )
			 )
			 startPt
			 direction
		       )
	     )
	     (entmod (subst (cons 11 end)
			    (assoc 11 elst)
			    elst
		     )
	     )

	     ;; affichage dynamique de la longueur dans la barre d'état
	     (grtext -1 (rtos len))
	    )

	    ;; clic droit
	    ((member (car gr) '(11 25))
	     (entdel line)
	     (setq loop	nil
		   line	nil
	     )
	    )

	    ;; Entrée ou Espace
	    ((member (cadr gr) '(13 32))
	     (cond
	       ;; longueur valide
	       ((and str (numberp (distof str)))
		(setq end  (mapcar
			     (function
			       (lambda (x1 x2)
				 (+ x1 (* (distof str) x2))
			       )
			     )
			     startPt
			     direction
			   )
		      loop nil
		)
		(entmod	(subst (cons 11 end)
			       (assoc 11 elst)
			       elst
			)
		)
	       )

	       ;; annUler
	       ((= (strcase str) "U")
		(entdel line)
		(setq loop nil
		      line nil
		)
	       )

	       ;; entrée non valide
	       (T
		(princ
		  "\nNécessite un nombre valide ou une saisie au pointeur.
			     \nSpécifiez la longueur ou [annUler]: "
		)
		(setq str "")
	       )
	     )
	    )

	    ;; Récupération des entrée au clavier
	    (T
	     ;; retour/effacer
	     (if (= (cadr gr) 8)
	       (or
		 (and
		   str
		   (/= str "")
		   (setq str (substr str 1 (1- (strlen str))))
		   (princ (chr 8))
		   (princ (chr 32))
		 )
		 (setq str nil)
	       )
	       (or
		 (and str
		      (setq str (strcat str (chr (cadr gr))))
		 )
		 (setq str (chr (cadr gr)))
	       )
	     )

	     ;; affichage sur la ligne commande
	     (and str (princ (chr (cadr gr))))
	    )
	  )
       )
     )
  )
)
 (and (entdel line) (setq line nil))
     )
   )
   (princ "\nLa direction est perpendiculaire à la vue")
 )
 (grtext)
 line
)

;;====================================================================;;

;;gc:3dTo2dPoint
;; Retourne le point 2d (x y)
;;
;; Argument: un point 3d (x y z)

(defun gc:3dTo2dPoint (p) (list (car p) (cadr p)))

;;====================================================================;;

;;gc:DotProduct Retourne le produit scalaire (réel) de deux vecteurs

(defun gc:DotProduct (v1 v2)
 (apply '+ (mapcar '* v1 v2))
)

;;====================================================================;;

;;; gc:Normalize Retourne le vecteur unitaire d'un vecteur

(defun gc:Normalize (v)
 ((lambda (l)
    (if (/= 0 l)
      (mapcar (function (lambda (x) (/ x l))) v)
    )
  )
   (distance '(0 0 0) v)
 )
)

;;====================================================================;;

;;; gc:IntersLinePlane Retourne le point d'intersection de la droite définie par p1 p2
;;; et du plan défini par un point et sa normale.

(defun gc:IntersLinePlane (p1 p2 org nor / scl)
 (if (and
(/= 0 (setq scl (gc:DotProduct nor (mapcar '- p2 p1))))
(setq scl (/ (gc:DotProduct nor (mapcar '- p1 org)) scl))
     )
   (mapcar (function (lambda (x1 x2) (+ (* scl (- x1 x2)) x1)))
    p1
    p2
   )
 )
)

;;====================================================================;;

;; gc:UCSProjectAboutView
;; Projette un point sur le plan du SCU courant suivant la vue courante
;;
;; Argument
;; pt : le point à projeter (coordonneés SCG)
;;
;; Retour : le point sur le plan du SCU courant (coordonneés SCG)

(defun gc:UCSProjectAboutView (pt)
 (gc:IntersLinePlane
   pt
   ((lambda (p)
      (trans
 (list (car p) (cadr p) (1+ (caddr p)))
 2
 0
      )
    )
     (trans pt 0 2)
   )
   (trans '(0 0 0) 1 0)
   (trans '(0 0 1) 1 0 T)
 )
)

 

Exemple d'utilisation, l'utilisateur spécifie le premier point, puis pour le second, on utilise gc:grDrawLine avec le point spécifié traduit dans le SCG et un angle de 20° (en fait 20 unités angulaire courante) dans le SCU courant. Comme gc:grDrawLine requiert un vecteur directeur dans le SCG, on calcule le vecteur à partir de l'angle (ici "20") et on le convertit dans le SCG.

Puis on lance la commande POLYLIGN avec les deux premiers points.

 

(defun c:hh (/ pt0 line)
 (if
   (and
     (setq pt0 (getpoint "\nSpécifiez le point de départ: "))
     (setq line (gc:grDrawLine
	   (trans pt0 1 0)
	   (trans (list (cos (angtof "20")) (sin (angtof "20")) 0.0) 1 0 T)
	 )
     )
   )
    (progn
      (entdel line)
      (command "_.pline" pt0 (trans (cdr (assoc 11 (entget line))) 0 1))
    )
 )
 (princ)
)

 

Il est possible de modifier gc:grDrawLine pour qu'elle fonctionne avec un point et un angle et qu'elle retourne le second point plutôt qu'une ligne.

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

Posté(e)

Re,

 

Un exemple un peu plus simple puisqu'on ne travaille qu'en 2d dans le SCU courant.

 

;; gc:GetPolarPoint (gile)
;; Invite l'utilisateur à saisir un point
;; Retourne le point dans le SCU courant
;;
;; Arguments
;; startPoint : point de départ dans le SCU courant
;; direction  : angle depuis l'axe X du SCU courant exprimé dans l'unité angulaire courante
;; message    : message d'invite

(defun gc:GetPolarPoint	(startPoint direction message / *error* dirVec gr loop len endPoint str)
 (defun *error* (msg)
   (and
     msg
     (/= msg "Fonction annulée")
     (princ (strcat "\nErreur: " msg))
   )
   (grtext)
   (redraw)
 )
 (princ message)
 (setq	direction (angtof (rtos direction 2 16))
dirVec	  (list (cos direction) (sin direction) 0.0)
loop	  T
 )
 (while
   (and (setq gr (grread T 12 0)) (/= (car gr) 3) loop)
    (cond
      ;; modification de la ligne en fonction de la position du pointeur
      ((= 5 (car gr))
(if (minusp (gc:DotProduct dirVec (mapcar '- (cadr gr) startPoint)))
  (setq dirVec (mapcar '- dirVec))
)
(setq len      (distance startPoint (cadr gr))
      endPoint (mapcar
		 (function
		   (lambda (x1 x2)
		     (+ x1 (* len x2))
		   )
		 )
		 startPoint
		 dirVec
	       )
)
(redraw)
(grdraw startPoint endPoint -1)
;; affichage dynamique de la longueur dans la barre d'état
(grtext -1 (rtos len))
      )

      ;; clic droit
      ((member (car gr) '(11 25))
(redraw)
(setq loop nil)
      )

      ;; Entrée ou Espace
      ((member (cadr gr) '(13 32))
(cond
  ;; longueur valide
  ((and str (numberp (distof str)))
   (setq endPoint (mapcar
		    (function
		      (lambda (x1 x2)
			(+ x1 (* (distof str) x2))
		      )
		    )
		    startPoint
		    dirVec
		  )
	 loop	  nil
   )
  )

  ;; annUler
  ((= (strcase str) "U")
   (redraw)
   (setq loop nil)
  )

  ;; entrée non valide
  (T
   (princ
     "\nNécessite un nombre valide ou une saisie au pointeur.
                                    \nSpécifiez la longueur ou [annUler]: "
   )
   (setq str "")
  )
)
      )

      ;; Récupération des entrée au clavier
      (T
;; retour/effacer
(if (= (cadr gr) 8)
  (or
    (and
      str
      (/= str "")
      (setq str (substr str 1 (1- (strlen str))))
      (princ (chr 8))
      (princ (chr 32))
    )
    (setq str nil)
  )
  (or
    (and str
	 (setq str (strcat str (chr (cadr gr))))
    )
    (setq str (chr (cadr gr)))
  )
)

;; affichage sur la ligne commande
(and str (princ (chr (cadr gr))))
      )
    )
 )
 (*error* nil)
 endPoint
)

;;====================================================================;;

;;gc:DotProduct Retourne le produit scalaire (réel) de deux vecteurs

(defun gc:DotProduct (v1 v2)
 (apply '+ (mapcar '* v1 v2))
)

 

Exemple d'utilisation :

 

(defun c:hh (/ p0 p1)
 (if
   (and
     (setq p0 (getpoint "\nSpécifiez le point de départ: "))
     (setq p1 (gc:GetPolarPoint p0 20 "\nSpécifiez le point suivant: "))
   )
    (command "_.pline" p0 p1)
 )
 (princ)
)

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

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é