x_all Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 bonjour je cherche un truc qui me parait pas évident, mais qui va sans doute vous paraitre simple... à moins que.. Je travaille sur fond de plan géomètre donc toujours très loin du 0,0 ; Et chaque fois que je fait des hachures grass ou gavel ou bien d'autres motif pas copier les propriétés, les hachures ont un aspect des plus étrange. Le problème est connu, il suffit de recaler le point d'origine de la hachure dans la polyligne qui à servie de contour. Sauf que je viens de recaler environ 80 hachure et que ça commence à me courir sur le haricot. Y a t il moyen de faire un lisp qui automatiserai ça... genre recaler toutes les hachures d'un jeu de sélection? personnellement, je ne voie pas par quel bout le prendre. Il y a bien les codes DXF 43 et 44 qui pourrais m'aider, mais j'ai du mal à concevoir un truc qui chercherai un point en auto au centre de sa polyligne... peut être je me complique la vie? quelques trucs sur autocad
-Olivier- Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 Bonjour x_all, Il y a ce sujet sur le calcul de centre de gravité d'une polyligne. Olivier
lecrabe Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 Hello A priori cette routine "PT-CEN" de Gilles est beton ! Elle dessine un point graphique au Centroid de UNE polyligne close ... Merci (gile), Bye, lecrabePT-CEN__par_GC.zip Autodesk Expert Elite Team
x_all Posté(e) le 26 août 2015 Auteur Posté(e) le 26 août 2015 Mouai la centroîde ça m'a l'air de faire un peu le marteau pour tuer une mouche sur la fenêtre... je suis en moyenne à 10 exp 6 de l'origine, je me suis dit que finalement en cliquant un pts pour l'ensemble des hachures ça allait le faire car mes dessins font rarement plus de qqs centaine de mètres d'emprise. j'ai donc tester le code suivant en demandant juste un point. pour la sélection, je me sert de SSHP de spécial sélection de (gile) qui me chope avant de lancer la commande toutes les hachure d'un certain patern. sauf que ça marche pas... alors que si je clique le même point à la main, ça marche... je dois louper quelque chose... Grrr à la main j'aurai déja fini... je vais encore me coucher tard... (defun mod-val (ent dx-code val / lst-dxf ini-val nou-val) (setq lst-dxf (entget ent)) (setq ini-val (assoc dx-code lst-dxf) nou-val (cons dx-code val) lst-dxf (subst nou-val ini-val lst-dxf) ) (entmod lst-dxf) (princ) ) (defun c:tmp (/ lstdxf ent) (princ "\n sélectionnez quelques entités ") (setq ss (ssget) i 0 ) (setq p1 (getpoint "sélectionner un point pour l'origine")) (repeat (sslength ss) (setq ent (ssname ss i)) (mod-val ent 43 (car p1)) (mod-val ent 44 (cadr p1)) (setq i (1+ i)) ) ;fin repeat (princ) ) Pour l'instant c'est un peu brut, mais c'est pour tester les fonctions... quelques trucs sur autocad
VDH-Bruno Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 Bonjour x_all En Lisp eegarde dans les Xdata (données étendus) de ta hachure, c'est là que se cache les coordonnées de l'origine que tu veux modifier et non dans les codes 43 et 44. A tester sur une hachure_$(assoc -3 (entget (car (entsel))'("acad"))) (-3 ("ACAD" (1010 0.0 0.0 0.0))) Sinon en Vlisp avec un (vlax-dump-object(vlax-ename->vla-object (car (entsel))))-tu verras une propriétés Origin qui est modifiable avec vla-put-Origin Si tu n'arrive pas à te débrouiller avec cela fait le savoir, je te posterai un petit exemple demain A+ et bon courage Apprendre => Prendre => Rendre
x_all Posté(e) le 26 août 2015 Auteur Posté(e) le 26 août 2015 ha la vacherie... je comprend vraiment pas grand chose au VBA. j'ai bien une trame pour initialiser le bousin que m'avais fait passer Patrick_35 quand j'avais besoin de modifier des attributs de blocs dynamique, en partant de cette base j'ai pondu ça: (defun c:tmp ( / ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) ; Activer le début de l'undo (princ "\n sélectionnez quelques entités ") (setq ss (ssget) i 0 ) (setq p1 (getpoint "sélectionner un point pour l'origine")) (repeat (sslength ss) (setq ent (ssname ss i)) (vla-put-Origin (vlax-ename->vla-object ent) p1) (setq i (1+ i)) ) ;fin repeat (vla-endundomark doc) ; Fin de l'undo (princ) ) malheureusement, ça me sort :erreur: valeur Lisp sans contrainte avec VARIANT de ce type: (1.98583e+006 2.22624e+006 0.0)j'ai bien lut quelque par des truc sur ces VARIANT, mais j'ai pas tout compris... ya a t il une fonction pour convertir mon P1 en Variant? ça me rapelle l'école quand mon prof de méca me reprocha de multiplier des choux par des carottes... erreur d’unités... ça marche pas!! quelques trucs sur autocad
(gile) Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 Salut, Pour les points, Autodesk fournit une fonction (vlax-3d-point) qui convertit un point LISP (liste de 3 nombres) en un variant. (vla-put-Origin (vlax-ename->vla-object ent) (vlax-3d-point p1)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Olivier Eckmann Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 Bonjour, Pour éviter cela, quand tu démarres (ouvres) ton dessin, tu tapes SNAPBASE en ligne de commande et tu cliques un point à proximité de ton dessin. A partir de là toutes tes hachures seront définies à partir de ce point et plus à partir de 0,0. Sinon tu mets la variable HPORIGINMODE à 5, comme cela toutes tes hachures auront comme point de base le centre de la zone à hachurer. Olivier
x_all Posté(e) le 26 août 2015 Auteur Posté(e) le 26 août 2015 Salut, Pour les points, Autodesk fournit une fonction (vlax-3d-point) qui convertit un point LISP (liste de 3 nombres) en un variant. (vla-put-Origin (vlax-ename->vla-object ent) (vlax-3d-point p1)) je l'avais tester celle là; mais ça me donne une autre erreur:Erreur Automation Le nombre d'éléments dans SafeArray est incorrect @ Olivier ma façon de travailler est peur etre un peu bancale. J'ai un fichier avec mes légende dans le quel j'ai mes calques types de ligne et de hachure. quand je fait des hachures, je fait typiquement des hachures définie par l'utilisateur avec les lignes à 45 espacée de .2. puis je fait un copier les propriété de celle qui est dans la légende. Elle à donc un point d'origine proche de Greenwich...je ne crois pas que changer les variable i fassent quelque chose... je testerai demain mais j'y crois pas quelques trucs sur autocad
Olivier Eckmann Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 Je viens de vérifier, la variable SNAPBASE ne fonctionne plus sur les versions récentes. Il faut que tu mettes la variable HPORIGINMODE à 1 puis tu tapes HPORIGIN et tu saisis un point proche de ta zone de travail.A partir de là toutes tes nouvelles hachures auront ce point comme point de base du calcul des hachures.Même si tu fais un copier propriété d'un modèle existant, le point de base est conservé. Je viens de faire le test dans un dessin en CC49, pas de souci, la méthode que tu utilises est parfaitement applicable avec les 2 variables bien définies. Olivier
VDH-Bruno Posté(e) le 26 août 2015 Posté(e) le 26 août 2015 je l'avais tester celle là; mais ça me donne une autre erreur:Erreur Automation Le nombre d'éléments dans SafeArray est incorrectLe problème vient de la fonction vlax-3d-point qui va te créer un safeArray à 3 éléments, même si tu lui en fournie 2, alors que la propriété Origine est définie en 2D (x,y) dans le plan de la hachure, il te faut créer le safeArray correspondant avec les fonctions vlax-make-safearray et vlax-safearray-fill Pour l'exemple((lambda (p1 ent / 2Dpt) (setq 2Dpt (vlax-make-safearray vlax-vbdouble '(0 . 1))) (vlax-safearray-fill 2Dpt (list (car p1) (cadr p1))) (vla-put-Origin (vlax-ename->vla-object ent) 2Dpt ) ) (getpoint "sélectionner un point pour l'origine") (car (entsel)) ) Mais en utilisant la syntaxe vlax-put tu peux renseigner la propriété Origine directement avec une liste de 2 éléments.((lambda (p1 ent) (vlax-put (vlax-ename->vla-object ent) 'Origin (list (car p1) (cadr p1))) ) (getpoint "sélectionner un point pour l'origine") (car (entsel)) ) A+Ps: La solution d'Olivier semble intéressante (avec 10 versions de retard je n'ai pas mieux..). Apprendre => Prendre => Rendre
x_all Posté(e) le 27 août 2015 Auteur Posté(e) le 27 août 2015 Effectivement Olivier à le bon truc que je ne manquerai pas d'utiliser dans les futurs dessins. Pour celui là de toute façon, je me les suis frappés à la pogne car il fallait que ça sorte hier soir. Ils sont bien les nouveaux petits menu contextuels des hachures, comme pour les polylignes ou "ajouter un sommet" et "transformer en courbe" font gagner pas mal de temps, mais à l'usage, quand on à à faire la manœuvre 100 fois dans l'après midi la 1/2 seconde qu'il faut pour faire apparaitre ce micro menu, puis l'attention qu'on doit avoir pour pas se tromper de fonction, ça soule grave... Je ne crois pas qu'on puisse attribuer un raccourcis à ces fonctions. Heureusement des lsip comme AddVertex-DelVertex ça sauve la mise... (j'ai plus le nom original car chez moi c'est Av DV tant je m'en sert) Pour le chalenge, et puis parce que j'ai plaisir à coder en suivant vos conseil, j'ai donc pondu ça (merci Bruno pour les explication de cette array 2d/3d) (defun vl-2d-point (pt / 2Dpt ) (setq 2Dpt (vlax-make-safearray vlax-vbdouble '(0 . 1))) (vlax-safearray-fill 2Dpt (list (car pt) (cadr pt))) ) (defun c:tmp (/ ss i p1 ent) (princ "\n sélectionnez des hachures à recaler ") (setq ss (ssget) i 0 ) (setq p1 (getpoint "sélectionner un point pour l'origine")) (repeat (sslength ss) (setq ent (ssname ss i)) (vla-put-Origin (vlax-ename->vla-object ent) (vl-2d-point p1)) (setq i (1+ i)) ) ;fin repeat (princ) ) cette fois ça ne plante plus, mais la hachure n'est pas modifiée... hors, dans les propriétés, l'origine est bien changée. Pourtant, si je repasse par le menu du bouton rond et que je re clique sur le même point cette fois le patern se met à jour... Donc, ne vous prenez plus là tête pour ma charrette d'hier, mais si qq1 à une explication ou une solution je suis preneur Au passage, HPORIGINMODE va rentrer au panthéon de mes variables à la con sans pour autant détrôner MIRRTEXT mais au moins sur le 2eme marche du podium quelques trucs sur autocad
VDH-Bruno Posté(e) le 27 août 2015 Posté(e) le 27 août 2015 Bonjour x_all, Bon j'ai pris 5mn, pour approfondir un peu le sujet et me créer un fichier teste (ce que je n'avais pas fait :unsure: ), je m'excuse car je me suis aperçu que je n'avais pas bien compris la problématique. La propriété Origine stocke les coordonnées à la création de la hachure, mais le calcul des données du motif se fait bien en fonction des codes 43 & 44 (attention ces codes peuvent être multiple). Donc modifier ultérieurement l'origine de la hachure sans passer par les commandes AutoCAD ne fonctionne pas, il n'y a pas de mise à jour automatique des données. La réponse à ton besoin peut ce faire par le "macrotage" de la commande _-hatchedit, ou en lisp "classique" en intervenant sur toutes les occurrences des codes 43 & 44 Pour le principe:((lambda (p1 ent / newdxf43 newdxf44) (setq newdxf43 (cons 43 (car p1)) newdxf44 (cons 44 (cadr p1)) ) (entmod (mapcar '(lambda (dxf) (cond ((= 43 (car dxf)) newdxf43) ((= 44 (car dxf)) newdxf44) (dxf) ) ) ent ) ) ) (getpoint "sélectionnez un point pour l'origine") (entget (car (entsel))) ) A+ Apprendre => Prendre => Rendre
x_all Posté(e) le 27 août 2015 Auteur Posté(e) le 27 août 2015 Ta virtuosité à l'utilisation de (lambda me laisse baba je testerai ça ... car je suis sur un autre dossier brulant pour ce soir... la vie classique des B.E. ... quelques trucs sur autocad
VDH-Bruno Posté(e) le 27 août 2015 Posté(e) le 27 août 2015 Re, Pour info (defun c:tmp (/ lstdxf ent) (princ "\n sélectionnez quelques entités ") (setq ss (ssget) i 0 ) (setq p1 (getpoint "sélectionner un point pour l'origine")) (repeat (sslength ss) (setq ent (ssname ss i)) (mod-val ent 43 (car p1)) (mod-val ent 44 (cadr p1)) (setq i (1+ i)) ) ;fin repeat (princ) ) Dans ton code tu faisais une erreur avec ces 2 lignes (mod-val ent 43 (car p1)) (mod-val ent 44 (cadr p1)) La première fois tu modifie le code 43 et la seconde en voulant modifier le code 44, tu rétablis l'ancienne valeur du code 43 mémorisé dans ta variable ent A+ Apprendre => Prendre => Rendre
Demixav Posté(e) le 27 août 2015 Posté(e) le 27 août 2015 Bonjour, je rencontre parfois ce problème et j'ai une autre méthode me semble-t-il... Double clic sur les hachures et je coche "utiliser par défaut l'étendue des contours".Possible de le faire par LISP? j'y connais rien... :/ En espérant avoir pu "aider"..Bonne journée!Xav AutoCad Map 3D 2011 - Covadis v16.0dWindows 7 - 64b
VDH-Bruno Posté(e) le 27 août 2015 Posté(e) le 27 août 2015 Bonjour, je rencontre parfois ce problème et j'ai une autre méthode me semble-t-il... Double clic sur les hachures et je coche "utiliser par défaut l'étendue des contours".Possible de le faire par LISP? j'y connais rien... :/ En espérant avoir pu "aider"..Bonne journée!Xav La réponse à ton besoin peut ce faire par le "macrotage" de la commande _-hatchedit, Demixav la macro lisp correspondant à ta proposition:(vl-cmdf "_-hatchedit" PAUSE "G" "D" "" "") A+ Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 27 août 2015 Posté(e) le 27 août 2015 Re, Ta virtuosité à l'utilisation de (lambda me laisse baba La fonction lambda fonctionne comme une fonction utilisateur, pour essayer de démystifier cela en quelques lignes définissons une fonction nommé cube…_$ (defun cube (n) (* n n n)) CUBE En nommant la fonction nous avons associé un symbol CUBE à la définition de la fonction _$ CUBE #<USUBR @18cc5cbc CUBE> On peut appeler ultérieurement la fonction par son nom de la façon suivante (et lui passer à ce moment son argument)_$ (cube 3) 27 Si tu observes la valeur de retour de la fonction defun, et la syntaxe utilisée pour appeler la fonction cube, tu t'aperçois que tu aurais très bien pu appeler la fonction cube au moment de sa définition en évaluant la valeur de retour du defun pour accéder à la définition contenu dans le symbol cube (même si c'est beaucoup moins lisible)$ ((eval (defun cube (n) (* n n n))) 3) 27 Et bien avec lambda c'est exactement pareil pour définir ta fonction, sauf que tu n'as pas de symbol à évaluer (car il n'y pas de nom pour accéder à ta définition de fonction)_$ (lambda (n) (* n n n)) #<USUBR @18cc5dc0 -lambda-> Pour exécuter la fonction, il suffit de définir la fonction anonyme immédiatement suivie de son/ses argument._$ ((lambda (n) (* n n n)) 3) 27 En espérant que tu sois plus à l'aise, lorsque tu passera à l'étude de mapcar, à ce moment relis en entête du forum l'explication de (gile) sur le sujet, cela devrait passer car je vois à l'écriture de ton code que ça progresse bien. A+ Apprendre => Prendre => Rendre
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