Aller au contenu

Lien entre Champ dynamique dans un bloc / Lisp / Objet


Messages recommandés

Posté(e)

Bonjour à tous,

J'ai un projet un peu ambitieux vu mon niveau (...)  pour une énième application de calcul d'aire sur base de polylignes.

L'idée première est de récupérer les aires de polylignes dans un bloc avec des champs dynamiques et de les exporter sous forme de tableau excel (ca c'est OK, j'ai regardé du coté du lisp Pline_Block et TotalArea)

L'étape suivante serait de générer des hachures associées à ces polylignes avec des couleurs associées aux noms de pièces

Et en bonus développer l'arborescence de classement de ces surfaces (par exemple bâtiment - étage - pièce) et gérer des déductions de polylignes à l'intérieur d'une surface..

Mais commençons par le début et à ma question: je n'arrive pas à comprendre comment fonctionne l'association entre le champ créé dans le bloc et la polyligne à laquelle on va l'associer. Par exemple, j'ai essayé d'ajouter au lisp Pline_Block un attribut pour indiquer le calque auquel la polyligne appartient mais je ne parviens pas à modifier le bloc de telle sorte que la valeur du champ dynamique s'ajuste correctement. 

C'est une question de base probablement mais je n'ai pas trouvé d'explication sur ce point. Si vous avez des éléments de réponse ou des liens vers des sujets où la question est traitée, je suis preneur. Merci!

 

Posté(e)

le soucis avec les blocs c est qu il ont un nom et quand tu l ai edite il prenne la forme d un nom de bloc précédé d un u*

en d autre terme ce qui est programmé dans le bloc peu ne pas fonctionner quand ce bloc est fermé et reprend ces attributions de définition de bloc aux champs sur le nom du bloc

il faut donc éditer les attributs un par un

quand le bloc est fermé puis lancer la commande formule en choisissant au départ le bloc puis ta commande et faire pour chaque champ la meme manip

normalement ça fonctionne

 

Posté(e)

Coucou,

@dc01, la dénomination des références de blocs ayant un *U--- c'est lorsque les blocs possèdent des propriétés dynamiques. Or ici le bloc créé n'est pas dynamique si mes souvenirs sont bons via la commande TotalArea.

@Dersou Je ne connais pas par cœur la structure du programme de Pline_Block et TotalArea mais il peut y avoir plusieurs solutions à ton problème. Cependant tout va dépendre de ce dont tu as réellement besoin de faire EN PLUS de ces programmes. Ce que je suggère c'est de laisser ces programmes intacts et de créer un autre programme pour gérer ce que tu souhaites faire en plus (cela permet que si tu as un problème de fonctionnement sur le programme TotalArea par exemple, l'auteur pourra plus facilement corriger le soucis car tout le monde aura le même).

Normalement TotalArea créé un bloc avec un attribut dont sa valeur est un champ dynamique objet. Ce champs utilise donc l'ID de la polyligne que tu as dû sélectionner et affiche la propriété "Aire". Cela se traduit par une chaîne de caractère un peu spéciale qu'AutoCAD est capable de lire (ex: %<\AcObjProp Object(%<\_ObjId 2294000122144>%).Area \f "%lu2">%  ). Il existe donc plusieurs façons de retrouver le calque de la polyligne à partir du bloc, notamment en utilisant l'ID de la polyligne apparaissant dans le champ dynamique. Le plus simple serait d'avoir un .dwg d'exemple affichant clairement les données de base ainsi que le résultat final (et si possible les étapes souhaitées pour y parvenir).

Evidemment si tu as besoin que l'on t'aide à développer un programme il nous faut un maximum d'infos sur ce que tu souhaites au final.

Bisous,
Luna

Posté(e)

Salut,

Pline_Block et TotalArea ne fonctionnent pas de la même façon. Pline_Block utilise des attributs avec des champs dynamiques, Total_Area utilise des réacteurs pour mettre à jour des attributs en temps réel.

Modifier le LISP TotalArea demande un bonne maitrise du langage LISP, modifier Pline_Block est moins difficile mais il faudrait connaître la version à modifier (il y en a eu de nombreuses).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci pour vos réponses.

Comme je tâtonne avec le LISP, je voulais effectivement débuter avec des modifications sur base de Pline_Block pour aborder la chose. Pour mon premier test d'ajout d'un attribut j'ai ajouté les éléments gras ci dessous:

;;; Pline_block -Gilles Chanteau- 13/04/07
;;; Insère le bloc "pline_block" après sélection d'une polyligne
;;; Attribut 1 : Nom de la pièce
;;; Attribut 2 : Longueur de la polyligne
;;; Attribut 3 : Aire de la polyligne
;;; Attribut 3 : Calque de la polyligne

(defun c:pline_block (/ AcDoc Space bloc nom ent obj ins op reg ech id long aire layer ref)
  (vl-load-com)
  (setq    AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
    Space (if (= (getvar "CVPORT") 1)
        (vla-get-PaperSpace AcDoc)
        (vla-get-ModelSpace AcDoc)
          )
  )
  (if (or
    (tblsearch "BLOCK" (setq bloc "Pline_block"))
    (findfile (setq bloc "Pline_block.dwg"))
      )
    (progn

      ;; attribut "nom de la pièce"
      (if (not (setq nom (getname "Nom de la pièce")))
    (setq nom "")
      )

      (while (not (setq ent (car (entsel)))))
      (setq    obj  (vlax-ename->vla-object ent))
      (if (= "AcDbPolyline" (vla-get-ObjectName obj))
    (progn
      (if (not
        (setq
          ins
           (getpoint
             "\nSpécifiez le point d'insertion ou < Centre >: "
           )
        )
          )
        (progn
          (if (= (vla-get-closed obj) :vlax-false)
        (progn
          (vla-put-closed obj :vlax-true)
          (setq op T)
        )
          )
          (setq reg    (vlax-invoke space 'addRegion (list obj))
            ins    (vlax-get (car reg) 'Centroid)
          )
          (if op
        (vla-put-closed obj :vlax-false)
          )
          (vla-delete (car reg))
        )
      )
      (if (not (vlax-ldata-get "Pline_block" "ech"))
        (vlax-ldata-put "Pline_block" "ech" 1)
      )
      (if (not (setq
             ech
              (getreal
            (strcat    "\nEntrez le facteur d'échelle <"
                (rtos (vlax-ldata-get "Pline_block" "ech"))
                ">: "
            )
              )
           )
          )
        (setq ech (vlax-ldata-get "Pline_block" "ech"))
        (vlax-ldata-put "Pline_block" "ech" ech)
      )
      (setq    id   (vla-get-ObjectID obj)

        ;; Attribut périmètre (m -> m)
        long (strcat "%<\\AcObjProp Object(%<\\_ObjId "
                 (itoa id)
                 ">%).Length \\f \"%lu2%pr2%ct8[1]\">%"
             )

        ;; Attribut surface (m² -> m²)
        aire (strcat "%<\\AcObjProp Object(%<\\_ObjId"
                 (itoa id)
                 ">%).Area \\f \"%lu2%pr2%ct8[1]\">%"
             )
      )

          ;; Attribut calque de la polyligne
        layer (strcat "%<\\AcObjProp Object(%<\\_ObjId"
                 (itoa id)
                 ">%).Layer \\f \"%tc1\">%"
             )
      
)

      (setq    ref
         (vla-InsertBlock
           Space
           (vlax-3d-point (trans ins 1 0))
           bloc
           ech
           ech
           1
                   (angle '(0 0 0) (trans (getvar 'ucsxdir) 0 (trans '(0 0 1) 1 0 T)))
         )
      )

      ;; attribution de leur valeur aux attributs
      (mapcar '(lambda (x y) (vla-put-TextString x y))
          (vlax-invoke ref 'GetAttributes)
          (list nom long aire layer)
      )

      (vla-regen AcDoc acActiveViewport)
    )
    (alert "L'objet sélectionné n'est pas une polyligne.")
      )
    )
    (alert "Le bloc \"Pline_block\" est introuvable.")
  )
  (princ)
)

 

Lors de la définition du nouvel attribut dans le bloc je ne parviens pas à faire le lien avec le paramètre de la polyligne. Je suis peut-être sur une fausse route.image.png.b51ee036efb668b519340700d5668e60.png

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é