Aller au contenu

Blocs dynamiques et coordonnées ...


Messages recommandés

Posté(e)

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,

 

Posté(e)

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.

Posté(e)

Re,

 

Ben non ... car bien que la case « Inclure les blocs imbriqués » soit cochée

et bien dans la boite de dialogue il n'est pas mentionné ... et donc pas de manip possible !

Posté(e)

C'est bon pour moi,

Pas besoin de repasser par un bloc intermédiaire, l'attribut peut caractériser le 1er cercle

Nécessité de régénérer pour une mise à jour mais bon c'est OK

Merci phil_vsd pour la piste à suivre ...

Posté(e)

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.

Posté(e)

Oui tout à fait, en y ajoutant un paramétre angulaire en plus

mais oui c'est bien ça

En 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 ...

  • 4 mois après...
Posté(e)

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)

Posté(e)

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.

Posté(e)

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 Object

je 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)

Posté(e)

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.

Posté(e)

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)

Posté(e)

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)

Posté(e)

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.

Posté(e)

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)

Posté(e)

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.

Posté(e)
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.

Posté(e)

(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)

Posté(e)

Bonjour

 

phil_vsd

Raisonne à 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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)

Posté(e)

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 ENFANT

04 - 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 attribut

06 - Concatainer cette donnée pour en faire un champ.

07 - Demande d'un point d'insertion P1

08 - Création au point P1 d'un Mtext avec champs dynamique avec la valeur de la ligne 06

09 - 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.

Posté(e)

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)

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é