Aller au contenu

Dessiner des flèches en polyligne


kclement

Messages recommandés

Bonjour à tous,

 

J'ai trouvé sur internet ce lisp plutôt sympa pour dessiner une flèche en polyligne :

 

;; dessine une flèche : les valeurs DIMSCALE et DIMASZ peuvent être changées pour modifier l'aspect ;;

(defun c:ARROW ( / SP ANGP ARRANG LENG EP)

(setq SP (getpoint "\n Starting point for arrow"))

(setq ANGP (getpoint SP "\n Select arrow angle"))

(setq ARRANG (angle sp angp))

(if (= 0.0 (getvar "DIMASZ"))

(setq LENG 1.0)(setq LENG (getvar "DIMASZ")))

(setq EP (polar sp arrang (* LENG (getvar "DIMSCALE"))))

(command "_PLINE" sp "_W" "0.0" (* 0.5 LENG (getvar"DIMSCALE"))

EP "_W" "0.0" "0.0" "ARC"))

 

Mon souci est qu'il utilise les valeurs DIMSCALE et DIMASZ qui définissent les proportions de la flèche, mais j'aimerais qu'à la place on ait des invites qui demandent la taille de la flèche et ses proportions (rapport hauteur/largeur).

 

Voilà, j'espère que ce sujet vous intéressera !

Lien vers le commentaire
Partager sur d’autres sites

Quelque chose comme ça ?

 

(defun c:ARROW (/ SP ANGP ARRANG LENG EP)
 (setq LENG (getdist "\nLongueur de la pointe: "))
 (setq RAP (getreal "\nRapport hauteur\\largeur de la pointe: "))
 (setq SP (getpoint "\nPoint de départ de la flèche: "))
 (setq ANGP (getpoint SP "\nAngle de la flèche"))
 (setq ARRANG (angle sp angp))
 (setq EP (polar sp arrang LENG))
 (command "_.PLINE"
   sp
   "_W"
   "0.0"
   (* LENG RAP)
   EP
   "_W"
   "0.0"
   "0.0"
   "_ARC"
 )
) 

 

[Edité le 30/10/2006 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour...........et merci ;) Gile pour ce lisp, voilà une flèche de repère qui me sera bien utile.

Parcontre serait-ce possible d'avoir la même chose c'est à dire tjs la flèche mais, ensuite, avec une polyligne plutôt qu'un arc et lui donner par défaut une épaisseur de 0.13mm...?? :exclam: :exclam: STP.

Merci d'avance,

Sylvain

Lien vers le commentaire
Partager sur d’autres sites

salut,

ce qui serait bien, ça serait que les dernières valeurs entrées soient par défaut , comme dans l'outil "décaler" par exemple, qu'on ai juste à faire "entrée" pour valider la longueur de la flèche précédente et le rapport...etc

Formateur Autocad - Revit - Sketchup - Photoshop

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

J'ai essayé de faire une réponse polyvalente avec une fonction plus aboutie.

 

Les dimensions proposées par défaut pour la pointe de la flèche sont celles des flèches des cotes courantes (type Fermée pleine).

 

Les valeurs utilisées (longueur de la pointe et rapport hauteur/largeur) seront reproposées au prochain lancement de la commande dans le dessin.

 

Après le dessin de la pointe, l'utilisateur reprend la main, et peut dessiner des segments droits ou en arc.

 

Le repérage polaire par rapport au dernier segment est activé pour faciliter le dessin d'un segment dans le prolongement de la pointe.

 

Nouvelle version

 

(defun c:ARROW (/ asn pol arrow_err leng ratio start ang)

 (defun arrow_err (msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (command)
   (setvar "AUTOSNAP" asn)
   (setvar "POLARMODE" pol)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (setq	asn	(getvar "AUTOSNAP")
pol	(getvar "POLARMODE")
m:err	*error*
*error*	arrow_err
 )
 (if (not *arrow-length*)
   (setq *arrow-length*
   (if (= 0 (getvar "DIMASZ"))
     (if (= 0 (getvar "DIMSCALE"))
       1.0
       (getvar "DIMSCALE")
     )
     (if (= 0 (getvar "DIMSCALE"))
       (getvar "DIMASZ")
       (* (getvar "DIMSCALE") (getvar "DIMASZ"))
     )
   )
   )
 )
 (if (not *arrow-ratio*)
   (setq *arrow-ratio* (/ 1.0 3))
 )
 (if (not (setq leng (getdist (strcat "\nLongueur de la pointe 				       (rtos *arrow-length*)
			       ">: "
		       )
	      )
   )
     )
   (setq leng *arrow-length*)
   (setq *arrow-length* leng)
 )
 (if (not
(setq
  ratio	(getreal
	  (strcat "\nRapport hauteur/largeur de la pointe 			  (rtos *arrow-ratio*)
		  ">: "
	  )
	)
)
     )
   (setq ratio *arrow-ratio*)
   (setq *arrow-ratio* ratio)
 )
 (initget 1)
 (setq start (getpoint "\nPoint de départ de la flèche: "))
 (initget 1)
 (setq ang (getorient start "\nAngle de la flèche"))
 (command "_.pline"
   start
   "_W"
   0.0
   (* leng ratio)
   (polar start ang leng)
   "_W"
   0.0
   0.0
 )
 (if (= 0 (getvar "ORTHOMODE"))
   (progn
     (setvar "POLARMODE" (+ pol (boole 2 1 pol)))
     (setvar "AUTOSNAP"  (+ asn (boole 2 24 asn)))
   )
 )
 (while (not (zerop (getvar "CMDACTIVE")))
   (command pause)
 )
 (setvar "AUTOSNAP" asn)
 (setvar "POLARMODE" pol)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

 

Pour Yalta,

Si tu veux donner une largeur de polyligne de 0.13 au(x) segment(s), remplace :

 

(command "_.PLINE"
   start
   "_W"
   0.0
   (* leng ratio)
   (polar start ang leng)
   "_W"
   [surligneur]0.0
   0.0[/surligneur]
 )

 

par :

 

(command "_.PLINE"
   start
   "_W"
   0.0
   (* leng ratio)
   (polar start ang leng)
   "_W"
   [surligneur]0.13
   0.13[/surligneur]
 )

[Edité le 31/10/2006 par (gile)]

 

[Edité le 1/11/2006 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Une petite modification/amélioration.

 

Plutôt que de valider les valeurs par défaut à chaque lancement, entrer "L" ou "R" pour modifier ces valeurs (Longueur et Ratio) avant de spécifier le premier point.

 

(defun c:ARROW (/ arrow_err asn pol leng ratio start ang)

 (defun arrow_err (msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (command)
   (setvar "AUTOSNAP" asn)
   (setvar "POLARMODE" pol)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (setq	asn	(getvar "AUTOSNAP")
pol	(getvar "POLARMODE")
m:err	*error*
*error*	arrow_err
 )
 (if (not *arrow-length*)
   (setq *arrow-length*
   (if (= 0 (getvar "DIMASZ"))
     (if (= 0 (getvar "DIMSCALE"))
       1.0
       (getvar "DIMSCALE")
     )
     (if (= 0 (getvar "DIMSCALE"))
       (getvar "DIMASZ")
       (* (getvar "DIMSCALE") (getvar "DIMASZ"))
     )
   )
   )
 )
 (if (not *arrow-ratio*)
   (setq *arrow-ratio* (/ 1.0 3))
 )
 (prompt
   (strcat "\nParamètres courants pour la pointe.\tLongueur: "
    (rtos *arrow-length*)
    "\tRatio: "
    (rtos *arrow-ratio*)
   )
 )
 (while (not (vl-consp start))
   (initget 1 "Longueur Ratio")
   (setq
     start (getpoint
      "\nPoint de départ de la flèche ou [Longueur/Ratio]: "
    )
   )
   (cond
     ((= start "Longueur")
      (if (setq leng (getdist (strcat "\nLongueur de la pointe 				       (rtos *arrow-length*)
			       ">: "
		       )
	      )
   )
 (setq *arrow-length* leng)
      )
     )
     ((= start "Ratio")
      (if (setq
     ratio (getreal
	     (strcat "\nRapport hauteur/largeur de la pointe 			     (rtos *arrow-ratio*)
		     ">: "
	     )
	   )
   )
 (setq *arrow-ratio* ratio)
      )
     )
   )
 )
 (setq	leng  *arrow-length*
ratio *arrow-ratio*
 )
 (initget 1)
 (setq ang (getorient start "\nAngle de la flèche"))
 (command "_.pline"
   start
   "_W"
   0.0
   (* leng ratio)
   (polar start ang leng)
   "_W"
   0.0
   0.0
 )
 (if (= 0 (getvar "ORTHOMODE"))
   (progn
     (setvar "POLARMODE" (+ pol (boole 2 1 pol)))
     (setvar "AUTOSNAP" (+ asn (boole 2 24 asn)))
   )
 )
 (while (not (zerop (getvar "CMDACTIVE")))
   (command pause)
 )
 (setvar "AUTOSNAP" asn)
 (setvar "POLARMODE" pol)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

Avec une sauvegarde de ces valeurs dans le dessin afin déviter le des rechercher ?

 

Oui, les valeurs sont sauvegardées dans me dessin pour la session dans des variables globales.

Tu pensais peut-être à des Xdata pour ne pas limiter à la session ?

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

Lien vers le commentaire
Partager sur d’autres sites

Voilà, les données sont conservées dans le dessin au delà de la session.

 

Il suffisait de remplacer :

- les (not *arrow-length*) par (not (vlax-ldata-get "arrow" "length"))

- les (rtos *arrow-length*) par (rtos (vlax-ldata-get "arrow" "length"))

et les (setq *arrow-length* ...) par (vlax-ldata-put "arrow" "length" ...)

de même pour *arrow_ratio* ...

 

(defun c:ARROW (/ arrow_err asn pol leng ratio start ang)
 (vl-load-com)

 (defun arrow_err (msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (command)
   (setvar "AUTOSNAP" asn)
   (setvar "POLARMODE" pol)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (setq	asn	(getvar "AUTOSNAP")
pol	(getvar "POLARMODE")
m:err	*error*
*error*	arrow_err
 )
 (if (not (vlax-ldata-get "arrow" "length"))
   (vlax-ldata-put "arrow" "length"
   (if (= 0 (getvar "DIMASZ"))
     (if (= 0 (getvar "DIMSCALE"))
       1.0
       (getvar "DIMSCALE")
     )
     (if (= 0 (getvar "DIMSCALE"))
       (getvar "DIMASZ")
       (* (getvar "DIMSCALE") (getvar "DIMASZ"))
     )
   )
   )
 )
 (if (not (vlax-ldata-get "arrow" "ratio"))
   (vlax-ldata-put "arrow" "ratio" (/ 1.0 3))
 )
 (prompt
   (strcat "\nParamètres courants pour la pointe.\tLongueur: "
    (rtos (vlax-ldata-get "arrow" "length"))
    "\tRatio: "
    (rtos (vlax-ldata-get "arrow" "ratio"))
   )
 )
 (while (not (vl-consp start))
   (initget 1 "Longueur Ratio")
   (setq
     start (getpoint
      "\nPoint de départ de la flèche ou [Longueur/Ratio]: "
    )
   )
   (cond
     ((= start "Longueur")
      (if (setq leng (getdist (strcat "\nLongueur de la pointe 				       (rtos (vlax-ldata-get "arrow" "length"))
			       ">: "
		       )
	      )
   )
 (vlax-ldata-put "arrow" "length" leng)
      )
     )
     ((= start "Ratio")
      (if (setq
     ratio (getreal
	     (strcat "\nRapport hauteur/largeur de la pointe 			     (rtos (vlax-ldata-get "arrow" "ratio"))
		     ">: "
	     )
	   )
   )
 (vlax-ldata-put "arrow" "ratio" ratio)
      )
     )
   )
 )
 (setq	leng  (vlax-ldata-get "arrow" "length")
ratio (vlax-ldata-get "arrow" "ratio")
 )
 (initget 1)
 (setq ang (getorient start "\nAngle de la flèche"))
 (command "_.pline"
   start
   "_W"
   0.0
   (* leng ratio)
   (polar start ang leng)
   "_W"
   0.0
   0.0
 )
 (if (= 0 (getvar "ORTHOMODE"))
   (progn
     (setvar "POLARMODE" (+ pol (boole 2 1 pol)))
     (setvar "AUTOSNAP" (+ asn (boole 2 24 asn)))
   )
 )
 (while (not (zerop (getvar "CMDACTIVE")))
   (command pause)
 )
 (setvar "AUTOSNAP" asn)
 (setvar "POLARMODE" pol)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
) 

 

[Edité le 8/11/2006 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

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é