bonuscad Posté(e) le 5 mai 2006 Posté(e) le 5 mai 2006 Je sais vous allez me dire la commande CONVERT fait cela. :P Oui MAIS, car il y a un mais. Essayez de convertir une Polyligne qui a été lissée ou splinée ! :casstet: Alors elle vient cette LwPolyligne? Nada! :mad: Vous en voulez une toute de même une ? et bien essayez cette routine. (defun c:my_convert ( / obj dxf_obj l_10 l_40 l_41 l_42 dxf_39 e_next dxf_next dxf_43 dxf_38) (while (not (setq obj (entsel "\nSélectionnez la polyligne2D à optimiser: ")))) (setq dxf_obj (entget (car obj)) l_10 nil l_40 nil l_41 nil l_42 nil) (cond ((and (eq (cdr (assoc 0 dxf_obj)) "POLYLINE") (zerop (boole 1 120 (cdr (assoc 70 dxf_obj)))) ) (if (cdr (assoc 39 dxf_obj)) (setq dxf_39 (cdr (assoc 39 dxf_obj))) (setq dxf_39 0.0) ) (setq e_next (entnext (car obj))) (while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next))))) (if (zerop (boole 1 (cdr (assoc 70 dxf_next)) 16)) (setq l_10 (cons (cdr (assoc 10 dxf_next)) l_10) l_40 (cons (cdr (assoc 40 dxf_next)) l_40) l_41 (cons (cdr (assoc 41 dxf_next)) l_41) l_42 (cons (cdr (assoc 42 dxf_next)) l_42) ) ) (setq e_next (entnext e_next)) ) (setq l_10 (reverse l_10) l_40 (reverse l_40) l_41 (reverse l_41) l_42 (mapcar '(lambda (x) (cons 42 x)) (reverse l_42)) ) (if (and (equal (apply 'max l_40) (apply 'min l_40)) (equal (apply 'max l_41) (apply 'min l_41))) (setq dxf_43 (car l_40) l_40 nil l_41 nil) (setq dxf_43 nil l_40 (mapcar '(lambda (x) (cons 40 x)) l_40) l_41 (mapcar '(lambda (x) (cons 41 x)) l_41) ) ) (if (not (zerop (caddar l_10))) (setq dxf_38 (caddar l_10)) (setq dxf_38 0.0) ) (setq l_10 (mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) l_10)) (entdel (car obj)) (entmake (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (assoc 67 dxf_obj) (assoc 410 dxf_obj) (assoc 8 dxf_obj) (if (assoc 62 dxf_obj) (assoc 62 dxf_obj) (cons 62 256)) (if (assoc 6 dxf_obj) (assoc 6 dxf_obj) (cons 6 "BYLAYER")) (if (assoc 370 dxf_obj) (assoc 370 dxf_obj) (cons 370 -1)) (cons 100 "AcDbPolyline") (cons 90 (length l_10)) (cons 70 (if (zerop (boole 1 (rem (cdr (assoc 70 dxf_obj)) 128) 1)) (boole 1 (cdr (assoc 70 dxf_obj)) 128) (1+ (boole 1 (cdr (assoc 70 dxf_obj)) 128)) ) ) (cons 38 dxf_38) (cons 39 dxf_39) ) (if (and l_40 l_41) (apply 'append (mapcar '(lambda (x10 x40 x41 x42) (append (list x10 x40 x41 x42)) ) l_10 l_40 l_41 l_42 ) ) (progn (cons 43 dxf_43) (apply 'append (mapcar '(lambda (x10 x42) (list x10 x42) ) l_10 l_42 ) ) ) ) (list (assoc 210 dxf_obj)) ) ) ) (T (princ "\nN'est pas une Polyligne2D, ou celle-ci est déjà optimisée!") ) ) (prin1) ) Code corrigé suite à une remarque d'un utilisateur, (Bug concernant les polylignes à largeur variable) et un oubli de copier-coller sur le code 41 affecté du code 40. [Edité le 12/5/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 5 mai 2006 Posté(e) le 5 mai 2006 Encore une fois EXCELLENT :D Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 5 mai 2006 Auteur Posté(e) le 5 mai 2006 Merci Gilles, Tu as été la source de mon inspiration suite à CECI Maintenant j'ai revu ma fonction (near_vertex) en conséquence et c'est au poil :D En plus maintenant elle fonctionne sur les polylignes splinées et lissées. J'ai pas fini tous mes tests mais ça se présente bien, plus de problèmes suivant les versions d'Autocad avec les fonctions (vlax-curve....) sur les polylignes non-optimisées (of course) ;) encore un petit problème avec (osnap [pt] "_near") sur les arcs, que je pense avoir résolu. Bon, j'y retourne... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 31 juillet 2006 Posté(e) le 31 juillet 2006 encore un petit problème avec (osnap [pt] "_near") sur les arcs, que je pense avoir résolu. Je pense que tu as du trouver depuis, mais je te livre un moyen que j'ai trouvé et qui semble bien fonctionner (à lancer à la suite du (entsel ...) pour qu'il n'y ait pas de risque que l'utilisateur change la vue entre temps). (setq ent (entsel)) (setq pick (vlax-curve-getClosestPointToProjection (setq obj (vlax-ename->vla-object (car ent))) (trans (cadr ent) 1 0) (trans (getvar "viewdir") ucszdir 0) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 31 juillet 2006 Auteur Posté(e) le 31 juillet 2006 Merci Giles de ta suggestion. J'ai bien essayer d'appliquer ta proposition, mais ça ne fonctionne pas toujours comme je le desirerais, ceci avec des LwPolylignes ou Polylignes2D dans des SCU non parrallèles. NB: j'ai remplacé ucszdir par (trans '(0 0 1) 1 0 T), nous sommes bien d'accord ? Les points obtenu sont à "perpètes" :casstet: Donc pour l'instant je reste sur ma solution, qui n'est pas très élégante, mais fonctionne. J'essayerais de mieux comprendre la fonction que tu as voulue faire à tête reposée ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 1 août 2006 Posté(e) le 1 août 2006 Salut, J'ai aussi réussi à mettre en défaut le code que je donnais, il semble que l'erreur vienne de la "traduction" du vecteur retourné par VIEWDIR du SCU vers le SCG. Il me semble avoir trouvé la solution : (setq ent (entsel)) (setq pick (vlax-curve-getClosestPointToProjection (setq obj (vlax-ename->vla-object (car ent))) (trans (cadr ent) 1 0) (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 1 août 2006 Auteur Posté(e) le 1 août 2006 Fonctionne beaucoup mieux. Après une série de test, seules les Polylignes2D dans un scu (non parrallèles au scg) donnent un résultat incorrect, pour des LwPolylignes c'est bon. Mais tu cherche à résoudre peut être un problème insoluble, car le (osnap pt "_near") coince aussi sur ce genre d'entité dans les mêmes conditions. Donc match nul ;) Ma solution (pas élegante) a été de convertir ces polylignes en lwpolylignes et de refaire (osnap pt "_near") sur celle-ci. J'essayerais quand même ta solution sous d'autres version dès que possible, car les fonctions (vlax-curve-...) réservent quelque fois des surprises suivant la version! :casstet: Le pire observé est surtout entre une 2000/(i) et supérieures. La 2000 n'est pas aboutie sur ces fonctions (vlax-curve-..). Suivant comment le code est monté, on a droit à des erreurs, ou des résultats "fantaisistes". Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 1 août 2006 Posté(e) le 1 août 2006 Mais tu cherche à résoudre peut être un problème insoluble, car le (osnap pt "_near") coince aussi sur ce genre d'entité dans les mêmes conditions. Donc match nul Pas tout à fait nul ;) Dans le même SCU (non parallèle au SCG), sur la même polyligne 2D (créée dans un autre SCU non parallèle au SCG), avec AutoCAD 2007: Commande: (setq ent (entsel) pick (trans (osnap (cadr ent) "_near") 1 0)) Choix de l'objet:Les objets dont l'échelle n'est pas uniforme sont ignorés.Erreur: type d'argument incorrect: point 2D/3D: nil*Annuler* Commande:Commande: (setq ent (entsel) pick (vlax-curve-getClosestPointToProjection((_> (setq obj (vlax-ename->vla-object (car ent)))((_> (trans (cadr ent) 1 0)((_> (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0))((_> )(_> ) Choix de l'objet: (3013.74 2339.87 1932.34) Et le point est correctement placé, celà va sans dire. ;) [Edité le 1/8/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 1 août 2006 Auteur Posté(e) le 1 août 2006 Pas tout à fait nul En effet: +1 pour toi ;) Et le point est correctement placé, celà va sans dire. Sur des polylignes2D classiques dans un SCU non parralèle, pas sous une V2000. :( Je testerais sous une 2002 et 2005 le plutôt possible. (je croise les doigts pour que ça fonctionne) En tout cas bravo pour ta fonction (osnap "_near") en vlax qui rendra service en construction 3D pour des entités mesurables avec les fonctions vlax. Tu vas devenir le "pro" de la programmation en 3D, tous mes encouragements ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bonuscad Posté(e) le 1 août 2006 Auteur Posté(e) le 1 août 2006 Nickel ! Je confirme. A partir d'une 2002 ça fonctionne correctement. Sous une 2000 cela confirme mes soupçons sur le comportement bizarroîde des fonctions (vlax-curve) Le Crabe pourra peut être me dire si j'ai raté un pacth qui corrigerai ce problème de compatibilité entre version? Mais bon l'importance est minime; les versions 2000 en cours ne sont pas légion. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 1 août 2006 Posté(e) le 1 août 2006 Tu vas devenir le "pro" de la programmation en 3D, tous mes encouragements Le "pro" ça veut dire que c'est rémunérateur, non ? Malheureusement, ce n'est toujours pas le cas, bientôt, j'espère. Plus sérieusement, merci pour le compliment et les encouragements, et aussi pour le retour, je suis content que ça marche. :D Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 2 août 2006 Posté(e) le 2 août 2006 Bonjour les "Pro" Il faut savoir que le V-Lisp (qui n'a pas été développé par Autodesk à l'origine) était une option "payante" sur AutoCAD R14 ! Il a été "packagé" dans AutoCAD "de base" avec la version 2000 et je crois savoir que son intégration ne s'est pas passé sans douleur ... Donc il est tout à fait possible que certaines fonctions V-Lisp n'aient été réellement opérationnelles qu'à partir de la version 2000i ou 2002 ! Pour un AutoCAD 2000, il faut le Patch Plot 2000 FRA et le Service Pack 1 2000 FRA, mais je ne suis pas sur du tout que cela corrige quoi que ce soit au niveau du V-Lisp !!! http://usa.autodesk.com/adsk/servlet/ps/dl/item?siteID=123112&id=2523163&linkID=2475161 http://usa.autodesk.com/adsk/servlet/ps/dl/item?siteID=123112&id=2524100&linkID=2475161 Le Decapode "admiratif" Autodesk Expert Elite Team
bonuscad Posté(e) le 2 août 2006 Auteur Posté(e) le 2 août 2006 Merci au Décapode "Service Packant" Tous les patchs étaient bien appliqués, par acquis de conscience j'ai réappliqué ceux-ci.En effet aucune correction pour ce problème précis qui persiste. Pour moi cela n'a pas une importance majeure vu l'utilisation de ce poste dédié à une tache précise. L'info est quand même bonne à savoir pour ceux qui pourrait être concernés, doivent pas être nombreux.... :P 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