bonuscad Posté(e) le 20 juin 2005 Posté(e) le 20 juin 2005 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
gile Posté(e) le 20 juin 2005 Posté(e) le 20 juin 2005 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 ) )
Titifonky Posté(e) le 20 juin 2005 Posté(e) le 20 juin 2005 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
bonuscad Posté(e) le 20 juin 2005 Auteur Posté(e) le 20 juin 2005 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
bonuscad Posté(e) le 20 juin 2005 Auteur Posté(e) le 20 juin 2005 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
gile Posté(e) le 20 juin 2005 Posté(e) le 20 juin 2005 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.
Titifonky Posté(e) le 20 juin 2005 Posté(e) le 20 juin 2005 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
bonuscad Posté(e) le 4 août 2006 Auteur Posté(e) le 4 août 2006 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant