thry0 Posté(e) le 4 septembre 2008 Posté(e) le 4 septembre 2008 Bjr à tous, Voici mon problème, qui bien sûr attend une solution ;) Voilà, j’ai un bloc dynamique (pour faire simple), constitué d’une ligne avec à une extrémité un cercle, lui-même un bloc. Cette ligne pouvant être étiré dynamiquement et l’extrémité libre de la ligne est le point d’insertion du bloc ...La finalité serait d’obtenir les coordonnées du cercle dans un tableau AutoCAD … malheureusement l’extraction d’attributs, solution vers laquelle je m’étais tout d’abord tourné, ne propose les coordonnées que du point d’insertion du bloc et pas d’un des éléments constituant ce bloc (le cercle), bien que la case « Inclure les blocs imbriqués » soit cochée.Comment contourner ce problème, sans Lisp dans un premier temps, si cela est possible.Merci par avance,
phil_vsd Posté(e) le 4 septembre 2008 Posté(e) le 4 septembre 2008 Hello, Dans ton cercle tu créés un attribut, dans cet attribut tu lui mets un champ renseigné par la position d'un autre petit bloc que tu mets au centre du cercle. Ce petit bloc tu le met sur un calque non imprimable. Quand tu étires ton bloc initial qui comprend tous les autres, l'attribut/champs dans le cercle pioche la position du petit bloc et l'affiche. Comme c'est un attribut, tu peux l'extraire. Non ? [Edité le 4/9/2008 par phil_vsd] "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
thry0 Posté(e) le 4 septembre 2008 Auteur Posté(e) le 4 septembre 2008 Re, Ben non ... car bien que la case « Inclure les blocs imbriqués » soit cochéeet bien dans la boite de dialogue il n'est pas mentionné ... et donc pas de manip possible !
thry0 Posté(e) le 4 septembre 2008 Auteur Posté(e) le 4 septembre 2008 C'est bon pour moi,Pas besoin de repasser par un bloc intermédiaire, l'attribut peut caractériser le 1er cercleNécessité de régénérer pour une mise à jour mais bon c'est OKMerci phil_vsd pour la piste à suivre ...
phil_vsd Posté(e) le 4 septembre 2008 Posté(e) le 4 septembre 2008 Ok, fais gaffe avec les mise à jour de champs si tu en a dans des X-ref. Les données se mettent à zéro... Faut recharger les X-ref, et jour sur la variable Fieldeval. A+++ [Edité le 4/9/2008 par phil_vsd] "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
thry0 Posté(e) le 4 septembre 2008 Auteur Posté(e) le 4 septembre 2008 Oui tout à fait, en y ajoutant un paramétre angulaire en plusmais oui c'est bien çaEn fait, pour la petite histoire, mon bloc final "représente" une chaîne d'ancre avec son ancre en extrémité (d'où la ligne paramétrable et le cercle pour modéliser l'ancre ...) Je te remercie pour m'avoir mis sur la voie (la bonne et pas celle de garage !) :)A charge de revanche ...
onossa Posté(e) le 28 janvier 2009 Posté(e) le 28 janvier 2009 Dans le même esprit, si j'ai bien saisi le post intial, j'aimerai qu'on m'indique si la manip suivante est possible avec autocad ou via lisp: - jai un bloc dans l'espace objet qui existe plusieurs fois, insérés avec des angles de rotation différents.J'ai plusieurs présentations d'espace papier. Dans chacune de celles-ci, j'aimerai placer un texte, qui irai chercher l'angle du block.Cela se fait sans probleme avec les fields.Le souci , est que ces fameux blocks de l'espace objets, sont imbriqués dans un autre block qui les contient tous. Et donc, le champ ne peut apparement pas atteindre le niveau 2 (angle de rotation d'un block contenu dans un block...J'ai essayé de créer un attribut dans mes petits blocs, espérant que le field aille recueillir l'angle de l'attribut, et, malgré qu'il me semblait hier avoir cru aboutir au resultat espéré, aujourd'hui je n'y arrive plus ! Est-ce une manip possible ? Où se trouve l'option dont vous parlez d'activer les blocks imbriqués ?? Merci pour votre aide ! L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
phil_vsd Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 salut Onossa, T'as essayé avec updatefield ? Voilà un petit lisp qui me sert pour mettre à jour les champs, sans passer par un Regen qui me fout en l'air les champs dans les X-ref : (defun c:MAJ (/) (setvar "fieldeval" 0) (setq ss (ssget "_x" '((8 . "nom_du_calque")))) ;;mettre le nom du calque où sont les champs (command "_.updatefield" ss "") (princ)) En gros ça sélectionne tous les objets dans le-dit calque et les met à jour. Voir ici pour le chargement d'un lisp A + "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
onossa Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Merci Chris. Le probleme, c'est que quand je veux créer le champ, il m'indique que l'objet sélectionné n'est pas l'attribut, mais le bock entier qi englobe le tout:Ce n'est pas tant un probleme d'update je pense. Ce qui j'ai dans la boite de dialogue de création du champ (c'est une version US) Field category: je sélectionne "Objects"En dessous, Field names: je sélectionne Objectje pointe l'attribut et l'object type affiché est: "Block Reference"Si je fais la même manip, mais en décomposant avant le block qui contient le tout, et que je recré donc un champ, là, je peut accéder à l'objet attribut... Toutes les idées sont les bienvenues... L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
phil_vsd Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Salut, Je pédale dans la semoule peut être mais t'as essayé de ne pas pointer l'attribut mais le bloc lui-même. Tu prends la propriété "Rotation", la 4 ème ligne en partant du bas. Non ? "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
onossa Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 En même temps, je me demande si, plutot que de passer par la boite de dialogue pour créer ce champ, qui apparament n'apporte pas la récursivité qui me permettrait de selectionner l'entitité attribut. Je pensais à sélectionner donc cet attribut par le biais d'un lisp, qui irai récupérer son ID et le placerai dans un texte choisi de l'espace papier...Est-ce faisable ?? L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
onossa Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Pour répondre à ta question Chris, oui j'ai essayé, et c'est ce qui serait le plus simple. Mais le hic, c'est que cette rotation, est la rotation du block "parent" et non pas du "petit block" imbriqué... L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
phil_vsd Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Oui c'est faisable, Giles avait fait Pline bloc qui concatainait des champs avec l'ID de l'objet choisit. Le tout mixé donnait un champs final avec l'info. En gros tu choisissait une polyligne, le lisp aspirait l'ID de la polyligne, reconstituait le champs (Tu comprends ? avec les % etc...) et te donnait en finalité un bloc-texte avec un attribut... 'tain quand je me relis je me comprends pas.... Edit : C'est qui Chris ?? [Edité le 29/1/2009 par phil_vsd] "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
onossa Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 J'ai vu, oui que c'était possible, maintenant, est-ce possible de récupérer cet object ID pour une entité imbriquée ? Car l'exemple que tu cite, est créée en cliquant directment au niveau de l'objet, et non pas un block qui le contiendrait. Pour exemplifier egalement, que se passerait-il si nous mettions cette pline dans un bloc, et voudrions récupérer les infos de cette pline ? L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
phil_vsd Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 oupss... Je suis un peu largué. Je pense que c'est possible mais te dire comment on fait... Il faudrait pointer un objet, que le lisp évalue les "sous-objet" et rapporte l'ID du bloc imbriqué. Vu qu'il porte tout le temps le même nom c'est assez faisable mais je n'ai pas les compétences Vlisp. Je viens d'ouvrir Pline Block en lisp, j'essaie de le décortiquer mais je rame... (setq id (vla-get-ObjectID obj) C'est par là que ça se passe... (if (= "AcDbPolyline" (vla-get-ObjectName obj)) Y'a de ça aussi... Virer le AcDbPolyline et le remplacer par un truc style "block"... ? Ce soir je fais joujou avec ce bout de code que j'ai trouvé chez Giles : ;; Ajout des blocs imbriqués à la liste (setq n_lst 0) (while (setq name (nth n_lst lst)) (setq bloc (vla-item (vla-get-blocks acDoc) name)) (repeat (setq n (vla-get-count bloc)) (setq ent (vla-item bloc (setq n (1- n)))) (if (and (= (vla-get-ObjectName ent) "AcDbBlockReference") (not (member (vla-get-name ent) lst)) ) "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
onossa Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Merci pour ton aide Chris. L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
phil_vsd Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Merci pour ton aide Chris. Qui c'est Chris ?? :D "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
onossa Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 (il faut que je me couche plus tôt et que je me repose un peu...) Pardonne moi Phil.Merci Phil et non pas Chris ! L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
Patrick_35 Posté(e) le 29 janvier 2009 Posté(e) le 29 janvier 2009 Bonjour phil_vsdRaisonne à l'envers.Avec nentsel, tu choisis ton entité et ensuite tu recherches le père. Par exemple en vlisp pour reprendre ton idée d'objectid.(setq ent (vlax-ename->vla-object (car (nentsel)))) (vla-objectidtoobject (vla-get-database ent)(vla-get-ownerid ent)) Le même en autolisp, ne fonctionne pas avec des attributs.(setq ent (car (last (nentsel)))) Un exemple pour retrouver tous les pères par rapport à l'objet sélectionné(and (setq ent (nentsel)) (eq (type (car (setq ent (last ent)))) 'ENAME) (princ (strcat "\nLe père de l'objet est " (cdr (assoc 2 (entget (car ent)))))) (while (cadr ent) (princ (strcat "\nLe père de " (cdr (assoc 2 (entget (car ent)))) " est " (cdr (assoc 2 (entget (cadr ent)))))) (setq ent (cdr ent)) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
onossa Posté(e) le 30 janvier 2009 Posté(e) le 30 janvier 2009 Au fait, le père m'importe peu. Je souahite plutot meme passer au travers !Dans l'hypothèse ou nous arriverions via dev à créer un field qui pointe vers un attribut, et que celui-ci, en plus d'appartenir à son block A, voit soit block intégré dans un autre block B (on ne peut alors pas, via commande autocad, aller editer cet attribut imbriqué), y a t'il malgré tout un update de ce field, sachant qu'en double cliquant donc sur l'attribut, il n'est alors considéré pour autocad que comme un block B ?? L'expérience est une lanterne qui n'éclaire que celui qui la porte... (Confucius)
phil_vsd Posté(e) le 30 janvier 2009 Posté(e) le 30 janvier 2009 J'suis d'accord avec toi Onossa. Le process de ton idée serait : 01 - On lance le lisp.02 - Lisp nous demande de pointer vers le block appellé PAPA.03 - Le lisp va voir dans le bloc PAPA si il y a un bloc ENFANT04 - Si oui, lire dans ENFANT la valeur de l'attribut qui est un champs dyn. (Rotation de ENFANT)05 - Extraire et stocker la valeur de cet attribut06 - Concatainer cette donnée pour en faire un champ.07 - Demande d'un point d'insertion P108 - Création au point P1 d'un Mtext avec champs dynamique avec la valeur de la ligne 0609 - Double Update des calques concernés pour être sûr que les valeurs soient mises à jour. Mais d'après Pat 35 faut peut être inverser les lignes 02 et 03... "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
onossa Posté(e) le 30 janvier 2009 Posté(e) le 30 janvier 2009 C'est bien cela Phil.Et étant novice, c'est ton approche qui me semble logique, me demandant comment serait-il possible de pointer autre chose que le block PAPA, puis ensuite l'inspecter.Un petit détail concernanrt le point 04: c'est éventuellement la rotation du texte lui même que le champ récupère. Champ mis en place au niveau de l'attdef, en tant que valeur par défaut de l'attribut.Au point 09, Mtext ou simple text, indiférent.Mais comme tu le vois, ce sont des détails. L'idée, tu l'as parfaitement comprise.. L'expérience est une lanterne qui n'éclaire que celui qui la porte... (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