Est-il possible, via un script LISP, d’intégrer une polyligne au milieu de la longueur d’un bloc dynamique représentant un mur, ce bloc possédant des paramètres d’épaisseur et de longueur avec un remplissage ?
Absolument. L’intégration d’une polyligne au centre de la longueur d’un bloc dynamique de mur est réalisable avec LISP, en exploitant les propriétés du bloc et les fonctions de dessin.
Voici une approche générale et les étapes clés :
-
Analyse du Bloc Dynamique :
- Il est crucial de comprendre comment le bloc dynamique est structuré. Les paramètres de longueur et d’épaisseur sont essentiels. L’ajout d’une polyligne au milieu de la longueur implique de calculer les coordonnées de ce point central.
- Si le bloc dynamique utilise des contraintes de géométrie (comme des contraintes de distance ou d’alignement), il faudra s’assurer que l’ajout de la polyligne ne perturbe pas leur fonctionnement.
-
Développement du Script LISP :
- Identification du Bloc : Le script devra d’abord permettre à l’utilisateur de sélectionner le bloc dynamique à modifier.
- Récupération des Paramètres : Utiliser la fonction
entgetpour obtenir la liste des entités du bloc, puisassocpour extraire les valeurs des paramètres de longueur et d’épaisseur. Les paramètres de longueur sont généralement associés à des contraintes de distance. - Calcul des Coordonnées :
- Si le bloc est inséré à l’origine (0,0) et aligné avec l’axe X, le point milieu de la longueur sera à
(longueur / 2, 0)par rapport au point d’insertion du bloc. - Si le bloc est rotatif, il faudra prendre en compte l’angle d’insertion pour calculer les coordonnées absolues du point milieu.
- Si le bloc est inséré à l’origine (0,0) et aligné avec l’axe X, le point milieu de la longueur sera à
- Création de la Polyligne :
- Utiliser la fonction
commandpour lancer la commandePLINE. - Spécifier les points de début et de fin de la polyligne. Pour une ligne simple au milieu de la longueur, il s’agira de deux points.
- Il est possible de définir la largeur de la polyligne pour qu’elle corresponde à l’épaisseur du mur, en utilisant les options de largeur de la commande
PLINE.
- Utiliser la fonction
- Association de la Polyligne au Bloc (Optionnel mais recommandé) : Pour que la polyligne suive les modifications du bloc dynamique, il faut l’ajouter comme une entité à l’intérieur du bloc. Cela se fait généralement en éditant le bloc (
BEDIT), en y insérant la polyligne calculée, puis en la liant aux paramètres de longueur et d’épaisseur via les outils de l’éditeur de blocs (par exemple, en utilisant des actions d’étirement ou de déplacement liées à des paramètres de distance).
-
Exemple de Logique LISP (Conceptuel) :
(defun c:AjouterPolyligneMur ()
(vl-load-com)
(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))
(setq mspace (vla-get-ModelSpace doc))
(princ "\nSélectionnez le bloc dynamique de mur : ")
(setq ent (car (entsel)))
(if (and ent (eq (cdr (assoc 0 (entget ent))) "INSERT"))
(progn
(setq obj (vlax-ename->vla-object ent))
(if (vlax-property-available-p obj 'IsDynamicBlock) ; Vérifie si c'est un bloc dynamique
(progn
(setq blocName (vla-get-Name obj))
; Récupérer les paramètres de longueur et d'épaisseur (nécessite une analyse plus poussée des propriétés du bloc)
; Exemple conceptuel :
(setq longueur (vla-GetDynamicBlockProperty obj "Longueur")) ; Fonction fictive, à adapter
(setq epaisseur (vla-GetDynamicBlockProperty obj "Épaisseur")) ; Fonction fictive, à adapter
(if (and longueur epaisseur)
(progn
; Calculer le point milieu (simplifié, suppose alignement sur X)
(setq insertionPt (vlax-get obj 'InsertionPoint))
(setq angle (vlax-get obj 'Rotation))
(setq milieuX (+ (car insertionPt) (/ longueur 2.0)))
(setq milieuY (cadr insertionPt))
; Créer la polyligne (exemple simple de ligne)
(setq pt1 (list milieuX milieuY))
(setq pt2 (list milieuX milieuY))
; Pour une ligne simple, on peut utiliser 'LINE' ou une 'PLINE' avec une seule segment
; Pour une polyligne avec épaisseur, il faut utiliser les options de PLINE
(command "_.PLINE" pt1 "" pt2 "" "") ; Ajout d'une ligne simple pour l'exemple
; Pour une polyligne avec épaisseur, il faudrait utiliser :
; (command "_.PLINE" "_W" 0.0 epaisseur pt1 "" pt2 "")
(princ (strcat "\nPolyligne ajoutée au milieu du bloc : " blocName))
)
(princ "\nImpossible de récupérer les paramètres de longueur ou d'épaisseur du bloc.")
)
)
(princ "\nL'objet sélectionné n'est pas un bloc dynamique.")
)
)
(princ "\nAucun objet sélectionné ou objet invalide.")
)
(princ)
)
Points d’attention pour une implémentation robuste :
- Gestion des Erreurs : Inclure des vérifications pour s’assurer que le bloc sélectionné est bien dynamique et possède les paramètres attendus.
- Complexité des Blocs Dynamiques : Les blocs dynamiques peuvent avoir des structures complexes avec plusieurs états et paramètres. Le script devra être adapté à la configuration spécifique de votre bloc de mur.
- Éditeur de Blocs : La méthode la plus propre pour que la polyligne suive les modifications du bloc est de l’ajouter directement dans l’éditeur de blocs (
BEDIT) et de lier son comportement aux paramètres existants. Le LISP peut alors être utilisé pour automatiser la création de cette polyligne lors de l’insertion ou pour des modifications ponctuelles.
Si vous pouvez fournir un exemple de votre bloc dynamique (.dwg), une solution LISP plus précise et adaptée pourra être développée.