Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

En faisant des tests sur un bout de code (longueur de périmètre), je viens d'avoir une désagréable surprise.

Le code suivant à l'air d'être correct avec des:

POLYLINE, LWPOLYLINE, LINE, CIRCLE, ELLIPSE et SPLINE.

Mais sur des ARC le résultat est faux, un "liste" sur l'arc ne retourne pas le même périmètre.

 

D'après vous, y a t-il une erreur dans le code? ou le problème est ailleurs

 

Merci de vos éclaircissements

 

(vl-load-com)

(setq

ent (car (entsel))

vlaobj (vlax-ename->vla-object ent)

pt_org (vlax-curve-getStartPoint vlaobj)

pt_end (vlax-curve-getEndPoint vlaobj)

param_start (vlax-curve-getStartParam vlaobj)

param_end (vlax-curve-getEndParam vlaobj)

perim_obj (vlax-curve-getDistAtParam vlaobj (+ param_start param_end))

)

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

Posté(e)

Salut,

Je ne sais pas si çà t'aide vraiment mais dans le même esprit (sans ActiveX) j'avais pondu çà :

;;; LONGOBJT Retourne la longueur ou le périmètre d'un objet (type entsel ou ename)

(defun LONGOBJT	(objt)
 (cond
   ((= (GETVAL 0 objt) "LINE")
    (distance (GETVAL 10 objt) (GETVAL 11 objt))
   )
   ((= (GETVAL 0 objt) "ARC")
    (* (ANGARC objt) (GETVAL 40 objt))
   )
   ((member (GETVAL 0 objt)
     '("CIRCLE" "ELLIPSE" "LWPOLYLINE" "SPLINE")
    )
    (command "_area" "_object" objt)
    (getvar "perimeter")
   )
   ((= (type (car objt)) 'ENAME)
    (princ "\nLa longueur de cet objet n'est pas définie.")
   )
 )
)

;;; ANGARC Retourne l'angle décrit par un arc de cercle.

(defun ANGARC (arc / ang)
 (setq ang (- (GETVAL 51 arc) (GETVAL 50 arc)))
 (if (minusp ang)
   (setq ang (+ (* 2 pi) ang))
 )
 ang
)

;;; GETVAL (Reini Urban) Retourne la première valeur du groupe d'une entité.
;;; Accepte tous les genres de représentations de l'entité
;;; (ename, les listes entget, les listes entsel)
;;; NOTE:  Ne peut obtenir que le premier groupe 10 dans LWPOLYLINE !

(defun getval (grp ele)					    ; "valeur dxf" de toute entité.
 (cond
   ((= (type ele) 'ENAME)				    ; ENAME
    (cdr (assoc grp (entget ele)))
   )
   ((not (vl-consp ele)) nil)				    ; élément invalide
   ((= (type (car ele)) 'ENAME)			    ; liste entsel
    (cdr (assoc grp (entget (car ele))))
   )
   (T (cdr (assoc grp ele)))				    ; liste entget
 )
)

Posté(e)

Bonjour Bonuscad,

 

As tu remarqué que l'on n'a pas besoins de faire la soustraction (ou l'adition) entre Param_end et Param_start.

Je ne sais pas pourquoi mais en ne specifiant que le parametre de fin le périmètre est bon pour toutes les entités : arc, polyligne, spline, ligne ...

Peut-etre une explication mathématique :casstet:

(vl-load-com)
 (setq
   ent		(car (entsel))
   vlaobj	(vlax-ename->vla-object ent)
   pt_end	(vlax-curve-getEndPoint vlaobj)
   param_end	(vlax-curve-getEndParam vlaobj)
   perim_obj	(vlax-curve-getDistAtParam
	  vlaobj
	[surligneur] param_end [/surligneur]
	) ;_ Fin de vlax-curve-getDistAtParam
 ) ;_ Fin de setq

www.le-metal.net, sur la métallerie
Posté(e)

Merci de ta réponse,

 

C'est vraiment a propos du code ActiveX que je voudrais une explication,

Je dispose déjà de code dans le même style,monté avec la commande "_area"

 

De plus j'ai déjà utiliser ce segment de code dans d'autres procédures, alors je voudrais bien comprendre, car comme je l'ai utilisé, il ne me pose pas de problème inséré dans la procédure suivante:

(defun draw_pt (pt / pt1 pt2 pt3 pt4)
(setq
	rap (/ (getvar "viewsize") 50)
	pt1 (list (+ (car pt) rap) (+ (cadr pt) rap))
	pt2 (list (+ (car pt) rap) (- (cadr pt) rap))
	pt3 (list (- (car pt) rap) (- (cadr pt) rap))
	pt4 (list (- (car pt) rap) (+ (cadr pt) rap))
)
(grdraw pt pt1 -1)
(grdraw pt pt2 -1)
(grdraw pt pt3 -1)
(grdraw pt pt4 -1)
)
(defun c:lg_curv ( / js ent vlaobj pt_org pt_end param_start param_end perim_obj mnpt mxpt minpt maxpt vmin vmax zt pt_brk abs_curv pt_tmp)
(while (not (setq js (ssget "_+.:S" '((0 . "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE")(-4 . ""))))))
(vl-load-com)
(redraw (setq ent (ssname js 0)) 3)
(setq
	vlaobj (vlax-ename->vla-object ent)
	pt_org (vlax-curve-getStartPoint vlaobj)
	pt_end (vlax-curve-getEndPoint vlaobj)
	param_start (vlax-curve-getStartParam vlaobj)
	param_end (vlax-curve-getEndParam vlaobj)
	perim_obj (vlax-curve-getDistAtParam vlaobj (+ param_start param_end))
)
(vla-GetBoundingBox vlaobj 'mnpt 'mxpt)
(setq
	minpt (trans (safearray-value mnpt) 0 1)
	maxpt (trans (safearray-value mxpt) 0 1)
	vmin (mapcar '- (getvar "viewctr") (list (/ (* (car (getvar "screensize")) (* 0.5 (getvar "viewsize"))) (cadr (getvar "screensize"))) (* 0.5 (getvar "viewsize")) 0.0))
	vmax (mapcar '+ (getvar "viewctr") (list (/ (* (car (getvar "screensize")) (* 0.5 (getvar "viewsize"))) (cadr (getvar "screensize"))) (* 0.5 (getvar "viewsize")) 0.0))
)
(setq zt (or (< (car minpt) (car vmin)) (< (cadr minpt) (cadr vmin)) (> (car maxpt) (car vmax)) (> (cadr maxpt) (cadr vmax))))
(if zt (command "_.zoom" "_window" "_none" minpt "_none" maxpt))
(while (setq pt_brk (getpoint "\nChoix du point pour définir l'abscise curviligne "))
	(setq pt_brk (vlax-curve-getClosestPointTo vlaobj (trans pt_brk 1 0)))
	(if pt_brk
		(progn
			(draw_pt (trans pt_org 0 1))
			(draw_pt (trans pt_brk 0 1))
			(setq abs_curv (vlax-curve-getDistAtPoint vlaobj pt_brk) ordon_y (caddr pt_brk))
			(princ (strcat "\nAbscise curviligne du point = " (rtos abs_curv) " Z du point = " (rtos ordon_y)))
			(princ "\n pour inverser le sens de parcours; /[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) 3)
						(draw_pt (trans pt_org 0 1))
						(draw_pt (trans pt_end 0 1))
						(setq abs_curv (- perim_obj abs_curv) pt_tmp pt_org pt_org pt_end pt_end pt_tmp)
						(princ (strcat "\nAbscise curviligne du point = " (rtos abs_curv) " Z du point = " (rtos ordon_y)))
					)
				)
			)
			(redraw)
		)
	)
)
(if zt (command "_.zoom" "_previous"))
(redraw ent 4)
(prin1)
)

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

Posté(e)

Merci Tififonky,

 

Je vais déjà regarder dans cette direction, ;)

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

Posté(e)

La solution de Titifonky semble marcher dans tous les cas, personnellement je ne vois aucune explication mathématique mais ce type de langage "objet" m'est très obscur.

Posté(e)

Bonjour,

 

Après quelques recherche, j'ai remarqué que pour les arcs, les cercles et les elipses, le paramètre correspond à l'angle au centre en radian.

Par exemple, quand on extrait le parametre de depart, on obtient l'angle par rapport au centre en radiant du point de départ.

 

Pour les lignes, le parametre de fin correspond à la longueur de la ligne.

 

Pour les polyligne, chaque sommet correspond à un nombre entier indiquant sa position dans la polyligne. Le parametre de fin indique le nombre de sommet moins 1.

 

Pour les splines bonnes question ? :question: :casstet:

 

Tout ça est quand même assez confus.

 

On peut en deduire qu'il n'y a aucune liaison entre les paramètres que l'on recupère sur différentes entités.

Autocad doit traité le paramètre en fonction de l'entité sur laquel il a été pris. :exclam:

 

Je ne sais pas si ces information vont beaucoup t'aider, je pense même que tu les connais déjà, mais elles peuvent servir à d'autre parceque je ne les ai pas trouvé sur le site.

www.le-metal.net, sur la métallerie
  • 1 an après...
Posté(e)

1 ans après, j'ai essayer d'évoluer sur ces fonctions (vlax-curve

 

Si je les trouve puissantes, rapides et fournissant un code compact, je reste cependant découragé par leur emploi.

 

Je n'arrête pas de trouver des différences de comportement suivant la version ou elles sont utilisées.

Je trouve cela vraiment très ennuyeux de ne pas pouvoir produire un code qui soit utilisable quelque soit la version utilisé. (200X)

En lisp classique ce problème était très rare, les codes pouvaient s'utiliser (s'il étaient bien montés) d'une version à une autre sans surprises.

 

Ce manque d'homogéité est quand même décourageant pour les développeurs qui aimeraient bien pouvoir créer du code qui soit facilement exploitable et pas seulement rataché à une version unique (ou presque).

 

C'est surtout le manque de transparence qui me gène, car jamais il n'est stipulé nulle part ces changements effectués sur les modes de fonctionnement. On a l'impression que c'est pareil qu'avant et en fait on découvre avec le temps qu'il n'en est rien (que d'heures perdues en pure perte!)

 

Voilà c'etait juste mon petit coup de gueule, mais le problème est toujours là.

 

Donc développeurs, il va falloir en plus de vos gestions d'erreurs penser à verrouiller vos applications suivant la version unique sous laquelle elle est créée, j"exagère à peine !!!

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

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é