Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Je suis a la recherche d'un moyen permettant de récupérer les coordonnées du vertext précédant ou suivant le point de "click" de sélection de la polyligne.

 

Je ne sais pas si c'est très clair mais j'aimerai, après un getpoint sur une polyligne (+ ssget pour sélectionner celle-ci), récupérer le sommet précédant ou suivant ce clique..

 

Savez vous s'il y a un moyen d'y parvenir ?

(Pour info le but de ma recherche est de calculer l'angle entre le getpoint et le sommet précédent/suivant...)

 

Voici une partie du code:

(setvar "osmode" 2)
 (while
   (setq ipt (getpoint "\Sélectionner un point sur la polyligne :\n"))
	(setq ipt (osnap ipt "_mid"))
   (setq ipt1 (list (+ (car ipt) 1) (- (cadr ipt) 1)))
   (setq ipt2 (list (- (car ipt) 1) (+ (cadr ipt) 1)))
	(setq ss  (ssget "_C" ipt1 ipt2 '((0 . "*POLYLINE")))))

 

 

Merci d'avance,

Posté(e)

Salut,

 

Les fonctions vlax-curve-* sont tes amies.

 

;; sélectionner une entité
(setq sel (entsel))
;; récupérer le nom d'entité (ENAME) de l'entité sélectionnée
(setq ent (car sel))
;; controler que l'entité sélectionnée est bien une polyligne
(= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
;; récupérer le point cliqué (coordonnées SCU courant)
(setq pt (cadr sel))
;; traduire le point en coordonnées SCG
(setq pt (trans pt 1 0))
;; obtenir le point le plus proche sur la polyligne
(setq pt (vlax-curve-getClosestPointToProjection ent pt (trans '(0 0 1) 2 0 T)))
;; obtenir le paramètre de la polyligne au point cliqué
(setq par (vlax-curve-getParamAtPoint ent pt))
;; obtenir le point sur le sommet précédent (point au paramètre entier inférieur)
(setq pt1 (vlax-curve-getPointAtParam ent (fix par)))
;; obtenir le point sur le sommet suivant (point au paramètre entier supérieur)
(setq pt2 (vlax-curve-getPointAtParam ent (1+ (fix par))))

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

Posté(e)

Coucou

 

Je suis dépité ...

J'ai passé du temps pour rien les explications existaient alors que je croyais être original...

J'ai retrouvé par tâtonnements successifs ce que tu expliques sans savoir que ce post existait

Je n'ai pas voulu te déranger comme je fais quelquefois mais là ça aurait vraiment valu le coup.

J'enrage...mais au moins je me suis creusé les méninges et je me suis rassuré sur ma capacité à comprendre.

Je vais le lire et en retirer ce qui me manque si ça se présente.

 

Merci beaucoup beaucoup

 

Posté(e)

Magnifique !!!

 

Merci.

 

Les fonctions Autolisp m'arrachent déjà les cheveux, alors les Vlisp... Elles dépassent de loin mes capacités et mon niveau de programmation.

 

J'aimerai maintenant, et pour finir, "boucler" ce programme avec la possibilité de d'annuler la dernière insertion de texte (undo, cnt-z ?) :

  • Sélection entité (lwpolyligne en l’occurrence) ;
  • Command texte ;
  • >> Possibilité d'annuler cette boucle par "u"/cnt-z ??

En gros comme la seconde partie de la commande TRIM, pendant la sélection des objets a ajuster

Sélectionnez l'objet à prolonger ou utilisez la touche Maj pour prolonger "la polyligne" ou [Trajet/cApture/Projection/Côté/annUler]:

La boucle ne me pose pas de problème, mais l'ajout du retour en arrière oui...

Une idée ? il faut peut être un getkwork ?

 

 

Code :

 


(defun c:alti (/ sel ent pt par pt1 pt2 elev ang angdeg txt ptins)

 (while
   (setq sel (entsel))
	;; récupérer le nom d'entité (ENAME) de l'entité sélectionnée
	(setq ent (car sel))
	;; controler que l'entité sélectionnée est bien une polyligne
	(= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
	;; récupérer le point cliqué (coordonnées SCU courant)
	(setq pt (cadr sel))
	(setq ptins (list (car pt) (cadr pt)))
	;; traduire le point en coordonnées SCG
	(setq pt (trans pt 1 0))
	;; obtenir le point le plus proche sur la polyligne
	(setq pt (vlax-curve-getClosestPointToProjection
	ent
	pt
	(trans '(0 0 1) 2 0 T)
     	)
	)
	;; obtenir le paramètre de la polyligne au point cliqué
	(setq par (vlax-curve-getParamAtPoint ent pt))
	;; obtenir le point sur le sommet précédent (point au paramètre entier inférieur)
	(setq pt1 (vlax-curve-getPointAtParam ent (fix par)))
	;; obtenir le point sur le sommet suivant (point au paramètre entier supérieur)
	(setq pt2 (vlax-curve-getPointAtParam ent (1+ (fix par))))
	;; recuperation de l'elevation
	(setq elev (atoi (rtos (caddr pt) 2 0)))
	;; recuperation de l'angle pt1>pt2
	(setq ang (angle pt1 pt2))
	;; transformation de l'angle en degré
	(setq angdeg (* (/ ang pi) 180))
	;; si l'angle est compris entre 90 et 270, additionner 180 degré
	(if (or (and (> angdeg 90) (< angdeg 270))
    )
  	(setq angdeg (+ angdeg 180))
	)
	;; hauteur du texte - simplifié.. 
	(setq txt 15)
   (command "_text" "m" ptins txt angdeg elev)
(princ)
) ;;end while
) ;;end defun

 

Posté(e)

Salut Dider,

 

Non non pas tout a fait.

 

ici le15 représente la taille du texte!

 

En fait, le nombre d'insertion (ou le nombre d’entité texte insérée) ne compte pas vraiment ici puisque je veux, a n'importe quel moment, pouvoir annuler cette insertion.

 

Par exemple, lorsque j’insère la 6eme entité "texte" et que l'insertion ne me plait pas (mauvais emplacement ou mauvais angle d'alignement par exemple), je souhaiterais annuler cette insertion (par un cnt-z ou Undo) et ensuite de pouvoir reprendre la commande pour d'autre insertion...

 

Je sais pas si c'est plus clair ?

Posté(e)

Salut,

 

Je suis justement en train de travailler sur des keyword permettant d'annuler une opération. La commande Annuler en soit fonctionne plutôt bien mais elle se contente uniquement de faire un retour sur les appels de (command), ici ça correspond à l'insertion du texte.

 

En revanche, l'ensemble de tes variables, elles, conservent leurs valeurs actuelles sans reprendre la valeur précédente.

 

Si jamais tu n'as pas besoin de faire un retour arrière sur la valeur de tes variables, pas trop de soucis à priori, autrement, je suis passé par la construction d'un liste avec l'historique des valeurs. En d'autres termes, si je choisi "annuler", je conserve le (cdr historique) et réaffecte les valeurs du (car historique) aux variables concernées)

 

J'avais commencé par ce prog pour mes recherches (c'est bancal et plutôt lourd en terme d'écriture mais j'en suis qu'au début de mes recherches, donc si quelqu'un à des idées à proposer, je suis preneur !!!) :

(defun c:RSD (/ *error* Option TypeR TypeR_Tmp Diam Diam_Tmp Pente Pente_Tmp Pt_ref Fe Last_Pt Dist Ang Text_Pt Diff_Fe Coeff_Unit u List_Pt)

(defun *error* (msg)

	(reinit)
	(princ msg)

)

(init)
(if (not (tblsearch "LAYER" "00-RESEAU"))
	(command "_LAYER" "N" "00-RESEAU" "CO" "160" "00-RESEAU" "TL" "CONTINUOUS" "00-RESEAU" "")
)
(command "_LAYER" "CH" "00-RESEAU" "")
(setvar "CECOLOR" "DUCALQUE")
(setq TypeR (getstring "\nVeuillez renseigner le type de réseau : ")
      Diam (getint "\nVeuillez renseigner le diamètre (en mm) : ")
      Pente (getreal "\nVeuillez renseigner la pente (en %) : ")
      Pt_ref (getpoint "\nVeuillez renseigner le point de référence : ")
      Fe (getreal "\nVeuillez renseigner le niveau NGF du fil d'eau (en m) : ")
      Last_Pt Pt_ref
;	      Color 5
      List_Pt (cons (cons Pt_ref Fe) List_Pt)
)
;	(VerifCalq (strcat "00-RESEAU " TypeR) Color "CONTINUOUS")
(command "_-INSERT" "Etiquette" Pt_ref 1 1 0 TypeR (strcat "\330  : " (itoa Diam)) (strcat "Fe : " (if (>= Fe 0) "+") (rtos Fe 2 2) " NGF"))
(while (/= Option "Quitter")
	(initget 128 "Type Diamètre Pente annUler Quitter")
	(if (null (setq Option (getpoint "\nSpécifier le point d'insertion suivant ou modifier les paramètres [Type de réseau/Diamètre canalisation/Pente/annUler] <ENTER pour Quitter> : ")))
		(setq Option "Quitter")
		(cond
			((= Option "Type")
				(if (/= (setq TypeR_Tmp (getstring (strcat "\nVeuillez renseigner le type de réseau <" (princ TypeR) "> : "))) "")
					(setq TypeR TypeR_Tmp)
				)
;					(if (= Color 6)
;						(setq Color 1)
;						(setq Color (1+ Color))
;					)
;					(VerifCalq (strcat "00-RESEAU " TypeR) Color "CONTINUOUS")
			)
			((= Option "Diamètre")
				(if (setq Diam_Tmp (getint (strcat "\nVeuillez renseigner le diamètre (en mm) <" (princ (itoa Diam)) "> : ")))
					(setq Diam Diam_Tmp)
				)
			)
			((= Option "Pente")
				(if (setq Pente_Tmp (getreal (strcat "\nVeuillez renseigner la pente (en %) <" (princ (rtos Pente 2 1)) "> : ")))
					(setq Pente Pente_Tmp)
				)
			)
			((= Option "annUler")
				(if (> (length List_Pt) 1)
					(progn
						(command "ANNULER" "R")
						(setq List_Pt (vl-remove (car List_Pt) List_Pt)
						      Last_Pt (caar List_Pt)
						      Fe (cdr (car List_Pt))
						)
					)
					(prompt "\nImpossible d'annuler l'implantation du point de référence.\nSi vous souhaitez tout de même le supprimer : Quitter la commande et relancer le programme RSD après avoir supprimé l'étiquette.\n")
				)
			)
			((= (type Option) 'LIST)
				(command "_UNDO" "M")
				(setq Dist (distance Last_Pt Option)
				      Ang (/ (* (angle Last_Pt Option) 180.0) pi)
				      Diff_Fe (/ (/ (* Pente Dist) 100.0) Coeff_Unit)
				      Fe (- Fe Diff_Fe)
				      List_Pt (cons (cons Option Fe) List_Pt)
				)
				(command "_-INSERT" "Etiquette" Option 1 1 0 TypeR (strcat "\330  : " (itoa Diam)) (strcat "Fe : " (if (>= Fe 0) "+") (rtos Fe 2 2) " NGF"))
				(command "_-TEXT" "J" "BC" "m2p" Last_Pt Option (* 0.2 Coeff_Unit) Ang (strcat "\330" (itoa Diam) " - " (rtos Pente 2 1) "%" " - Lg. " (rtos (/ Dist Coeff_Unit) 2 2) " m"))
				(setq Last_Pt Option)
			)
		)
	)
)

(reinit)
)

 

Bon ici, j'ai dû placer des balises de recall pour la commande ANNULER en raison du double appel à la fonction (command) devant être annuler en une fois.

 

En espérant avoir été utile.

Posté(e)

Pour éviter le copier/coller, je te donne un exemple simple qui montre le principe.

 

(defun c:test (/ msg pt ents)
 (while
   (setq pt (if ents
              ;; si la liste d'entités n'est pas vide
              (progn
                (initget "annUler")
                (getpoint "\nSpécifiez un point ou [annUler]: ")
              )
              ;; sinon
              (getpoint "\nSpécifiez un point: ")
            )
   )
    (if (listp pt)
      ;; si l'utilisateur a spécifié un point (une liste)
      (progn
        ;; on crée l'entité point
        (command "_.point" "_non" pt)
        ;; on ajoute l'entité créée à la liste d'entités
        (setq ents (cons (entlast) ents))
      )
      ;; sinon (l'utilisateur a entré U)
      (progn
        ;; on efface la première entité de la liste d'entité
        (entdel (car ents))
        ;; on redéfinit la liste sans la première entité
        (setq ents (cdr ents))
      )
    )
 )
 (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é