Analyser les ports non connectés dans la modélisation 3D

(télécharger l’application AP3D_CtrlConnexions.fas)

Voici un programme AutoLISP qui analyse tous les objets PLANT 3D pour détecter les ports non connectés.

Après avoir chargé le fichier « AP3D_CtrlConnexions.fas » saisissez la commande « AP3D_CtrlConnexions ».
Trois options :
N pour numéro ligne. Les jokers sont autorisés dans le nom du numéro de ligne.
S pour sélectionner des objets Plant 3D
T pour tous les objets Plant 3D

Après le traiiement, pour localiser un composant non connecté, saisissez la commande « ZZ » puis son numéro ID, par exemple « ZZ » et « 63 » pour localiser la non connexion numéro ID 63.

La localisation du point non connecté se fait au centre de l’écran.

Pour réafficher la liste des ports non connectés, tapez la commande « AP3D_ListeDesNoConnections »

 

 

Exporter les coordonnées des ports des composants 3D

(télécharger l’application AP3D_CoordonneesPorts)

Voici un petit programme AutoLISP qui analyse les objets PLANT 3D et en extrait, dans un fichier TXT, les coordonnées des ports S1, S2, …

Voici le code du programe


;|
Dominique VAQUAND
14.12.2022
================================
Export des coordonnées des ports
================================
|;

(defun c:AP3D_CoordonneesPorts (/ Selection CalqueCourant Fichier NomFichier
OBJ OBJ_1 OBJ_2
PT_10 Index_S
Index PT_S1 PT_S2 PT_S3
)

(vl-load-com)

; Gestion Erreur

(defun *error* (s)
(close Fichier)
(setq *error* nil)
)

; Sélection des objets PLANT 3D
(setq Selection (ssget (list (cons 0 "ACPPP*,ACPPC*"))))

(setq Index_S 0)

; Si des objets sont sélectionnés

(if Selection

(progn

; Création du fichier

(setq NomFichier (getfiled "Extraction ports" "" "txt" 1))

(setq Fichier (open NomFichier "W"))

; Boucle sur le nombre d'objet PLANT 3D sélectionnés

(repeat (sslength Selection)

; récupération des codes DXF primaires et VLA

(setq OBJ (entget (ssname Selection Index_S)))
(setq VLA_OBJ (vlax-ename->vla-object (ssname Selection Index_S)))

; Mémorisation de la coordonnée départ ou point d'insertion
(setq PT_10 (cdr (assoc 10 (reverse OBJ))))

; Mémorisatiobn des pointeurs
(setq OBJ_1 (entget (cdr (assoc 330 OBJ))))

; traitement pour trouver les coordonnées des ports

(TraitePortsObj obj_1 360 obj PT_10 VLA_OBJ)

(setq index_S (1+ index_S))

) ;repeat
)
) ;if

; Fermeture du fichier

(close Fichier)

(if (findfile NomFichier)
(startapp "NotePad" NomFichier)
)

(princ)
)

;|
====================
Traitement des ports
====================
|;

(defun TraitePortsObj (Obj1x Codedxf objx PT_10x VLA_OBJx / PT_S1A
PT_S2A PT_S3A PT_S4A PT_S5A PT_S6A index
OBJ_2
)

;; Tyuyau = (0 . "ACPPPIPE")
;; PT_10 et PT_11 existe

;; Composants = (0 . "ACPPPIPEINLINEASSET") ou (0 . "ACPPCONNECTOR")

(setq index 0)
(setq PT_S1 nil
PT_S2 nil
PT_S3 nil
PT_S4 nil
PT_S5 nil
PT_S6 nil
)

; si l'objet PLANT 3D est un tuyau on récupére les coordonnées des ports S1 et S2
; directement depuis la liste des clés primaires

(if (= (cdr (assoc 0 objx)) "ACPPPIPE")
(progn
(setq pt_s1 (cdr (assoc 10 (reverse objx)))
pt_s2 (cdr (assoc 11 (reverse objx)))
)

(princ (strcat "\nComposant : " (vlax-get-property VLA_OBJx "PartFamilyLongDesc") " \ DN= " (vlax-get-property VLA_OBJx "Size") " \ Handle= " (vlax-get-property VLA_OBJx "Handle") "\n") Fichier)
(princ (strcat "Num ligne= " (vlax-get-property VLA_OBJx "LineNumberTag") " Etiquette= " (vlax-get-property VLA_OBJx "Tag") "\n") Fichier)
(princ (strcat "S1=" (rtos (car pt_s1))","(rtos (cadr pt_s1))","(rtos (caddr pt_s1)) "\nS2=" (rtos (car pt_s2))","(rtos (cadr pt_s2))","(rtos (caddr pt_s2))"\n") Fichier)

)
)

(if (= (cdr (assoc 0 objx)) "ACPPPIPEINLINEASSET")

; Sinon on recherche les ports S1, S2, ... depuis un nouveau pointeur
; une fois les ports S1, S2, ... trouvés on récupère les coordonnées du port
(progn

(setq OBJ_2 (entget (cdr (assoc Codedxf OBJ1x))))

; on boucle sur la liste pour récupérer les coordonnées du port

(setq Ports "")

(repeat (length OBJ_2)

(if (= (cdr (nth index OBJ_2)) "S1")
(if (= PT_S1 nil)
(progn
(setq PT_S1 (cdr (nth (1+ index) OBJ_2)))
(setq Ports (strcat Ports "S1=" (rtos (car pt_s1))","(rtos (cadr pt_s1))","(rtos (caddr pt_s1))"\n"))
)
)
)

(if (= (cdr (nth index OBJ_2)) "S2")
(if (= PT_S2 nil)
(progn
(setq PT_S2 (cdr (nth (1+ index) OBJ_2)))
(setq Ports (strcat Ports "S2=" (rtos (car pt_s2))","(rtos (cadr pt_s2))","(rtos (caddr pt_s2))"\n"))
)

)
)

(if (= (cdr (nth index OBJ_2)) "S3")
(if (= PT_S3 nil)
(progn
(setq PT_S3 (cdr (nth (1+ index) OBJ_2)))
(setq Ports (strcat Ports "S3=" (rtos (car pt_s3))","(rtos (cadr pt_s3))","(rtos (caddr pt_s3))"\n"))
)
)
)

(if (= (cdr (nth index OBJ_2)) "S4")
(if (= PT_S4 nil)
(progn
(setq PT_S4 (cdr (nth (1+ index) OBJ_2)))
(setq Ports (strcat Ports "S4=" (rtos (car pt_s4))","(rtos (cadr pt_s4))","(rtos (caddr pt_s4))"\n"))
)
)
)

(if (= (cdr (nth index OBJ_2)) "S5")
(if (= PT_S5 nil)
(progn
(setq PT_S5 (cdr (nth (1+ index) OBJ_2)))
(setq Ports (strcat Ports "S5=" (rtos (car pt_s5))","(rtos (cadr pt_s5))","(rtos (caddr pt_s5))"\n"))
)
)
)

(if (= (cdr (nth index OBJ_2)) "S6")
(if (= PT_S6 nil)
(progn
(setq PT_S6 (cdr (nth (1+ index) OBJ_2)))
(setq Ports (strcat Ports "S6=" (rtos (car pt_s6))","(rtos (cadr pt_s6))","(rtos (caddr pt_s6))"\n"))
)
)
)

(setq index (1+ index))

) ;repeat

;on écrit les coordonnées des ports
(princ (strcat "\nComposant : " (vlax-get-property VLA_OBJx "PartFamilyLongDesc") " \ DN= " (vlax-get-property VLA_OBJx "Size") " \ Handle= " (vlax-get-property VLA_OBJx "Handle") "\n") Fichier)
(princ (strcat "Num ligne= " (vlax-get-property VLA_OBJx "LineNumberTag") " Etiquette= " (vlax-get-property VLA_OBJx "Tag") "\n") Fichier)
(princ Ports Fichier)

)
) ;if

(princ)

) ;defun

 

Gérer les images dans la palette de substitution des symboles P&iD

Lire la note technique TUYAU 39
TUYAU_AP3D_Note_39.pdf (257 téléchargements )

(télécharger l’application AP3D_CodeImagePngEnXML pour coder l’image )

Vérifier la pente d’une tuyauterie

Il existe bien la commande PLANTPIPESLOPE qui permet de vérifier la pente d’une tuyauterie mais celle-ci n’est pas très conviviale si l’on n’a pas à modifier la pente.

Voici donc un petit programme écrit en AutoLISP permettant de vérifier rapidement la pente et l’angle d’une tuyauterie.

Ce programme est mémorisé dans le fichier « AP3D_VerifPenteTuyau.lsp ». La commande à lancer se nomme « AP3D_VerifPenteTuyau ».

AP3D_VerifPenteTuyau.zip (223 téléchargements )

Voici le code du programe

;|
Dominique VAQUAND
25.02.2022
www.dovaq.fr
=================================================
Vérification pente et angle d'un tuyau Plant 3D
=================================================
|;

(defun c:AP3D_VerifPenteTuyau ( / ObjSelection pt1 pt2 Pt1_XY pt2_XY Long_Tuyau Long_Tuyau_XY Delta_Z Pente_Tuyau Angle_Tuyau)

(setvar "cmdecho" 0)

(defun *error* (s)
(command-s "_ucs" "_p")
(setq *error* nil)
)

(setq ObjSelection T)

(while ObjSelection

(princ "\nSélectionnez un tuyau: ")
(setq ObjSelection (entget (car (entsel))))

;; Vérification que l'objet sélectionné est bien un tuyau
(if (= (cdr (assoc 0 ObjSelection)) "ACPPPIPE")
(progn

(command "_ucs" "")

;; Récupère les coordonnées du point début et fin du tuyau
(setq Pt1 (cdr (assoc 10 (reverse ObjSelection))))
(setq Pt2 (cdr (assoc 11 (reverse ObjSelection))))

;; Calcul longueur du tuyau
(setq Long_Tuyau (distance Pt1 Pt2))

;;; (setq distance_X (abs (- (car pt1) (car pt2)))
;;; distance_Y (abs (- (cadr pt1) (cadr pt2)))
;;; )
;;; (setq Distance_XY (sqrt (+ (expt distance_x 2) (expt distance_y 2))))

;; Projection en XY des points PT1 et PT2
(setq Pt1_XY (list (car pt1) (cadr pt1) 0))
(setq pt2_XY (list (car pt2) (cadr pt2) 0))
(setq Long_Tuyau_XY (distance Pt1_xy Pt2_xy))

;; Calcul distance en Z
(setq Delta_Z (abs (float (- (caddr pt1) (caddr pt2)))))

(if (equal Pt1_XY pt2_XY)
(alert "Tuyau vertical")
(progn

;; Calcul pente du tuyau
(setq Pente_Tuyau

(strcat "Pente = " (rtos (abs (* 100.0 (/ Delta_Z Long_Tuyau_xy))) 2 1) "%")
)

;; Calcul angle du tuyau
(setq Angle_Tuyau (strcat "Angle = " (rtos (abs (* (atan (/ Delta_Z Long_Tuyau_xy)) (/ 180 pi))) 2 1) "°"))

;; Affichage sur ligne de commande
(princ (strcat "Vérification Pente : " Pente_Tuyau " " Angle_tuyau))

;; Affichage des informations Pente et Angle
(alert (strcat "Vérification Pente\n\n" Pente_Tuyau "\n" Angle_tuyau))

)
)

(command-s "_ucs" "_p")

); fin condition vrai

(alert "Cet objet n'est pas un tuyau")
); Fin de la condition

); fin du while

(princ)

); fin du programme

Créer des axes sur des conduites de tuyauteries

AutoCAD Plant 3D ne matérialise pas les traits d’axe des conduites de tuyauterie. Ce n’est qu’en sélectionnant un tuyau, une ligne que les traits d’axe apparaîssent furtivement.

Voici une étude d’un programme AutoLISP qui construit les traits d’axe sur tous les objets Plant 3D sélectionnés. Cette étude vous montre comment, avec ce langage AutoLISP, traiter des objets Plant 3D.

Ce programme est mémorisé dans le fichier « Ap3D_AxesT.lsp » et contient deux commandes :

  • La commande « Ap3D_AxesT » qui permet de créer les traits d’axe et les place sur le calque « AP3D_Axes_Tuyauterie »
  • La commande « AP3D_EffacerAxesT » qui permet d’effecer tous les objets sur le calque « AP3D_Axes_Tuyauterie »

Ap3D_AxesT.zip (211 téléchargements )

Je vous invite également à lire la note technique N° 34 de TUYAU

;|
Dominique VAQUAND
20.02.2020
=====================================================
Trace un trait d'axe sur des conduites de tuyauteries
=====================================================
|;

(defun c:AP3D_AxesT (/ Selection CalqueCourant
Osmode OBJ OBJ_1 OBJ_2
X_LignesAxes PT_10 Index_S
Index PT_S1 PT_S2 PT_S3
)

(setvar "cmdecho" 0)

; Sélection des objets PLANT 3D
(setq Selection (ssget (list (cons 0 "ACPPP*,ACPPC*"))))

(setq Index_S 0)

; Si des objets sont sélectionnés

(if Selection

(progn

; Mémorisation des paramètres de départ

(setq CalqueCourant (getvar "clayer"))
(setq Osmode (getvar "osmode"))
(setvar "osmode" 0)
(command "_ucs" "")

; Gestiion Erreur

(defun *error* (s)
(setvar "osmode" osmode)
(setvar "clayer" CalqueCourant)
(command "_UCS" "_p")
(setq *error* nil)
)

; Création du calque AP3D_Axes_Tuyauterie s'il n'existe pas ou met courant ce calque
(if (= (tblsearch "layer" "AP3D_Axes_Tuyauterie"))
(command "_layer" "_T" "AP3D_Axes_Tuyauterie" "_UN" "AP3D_Axes_Tuyauterie" "")
)

(command "_layer" "_m" "AP3D_Axes_Tuyauterie" "_co" "1" "" "" )

; Boucle sur le nombre d'objet PLANT 3D sélectionnés

(repeat (sslength Selection)

; récupération des codes DXF primaires

(setq OBJ (entget (ssname Selection Index_S)))

; Mémorisation de la coordonnée départ ou point d'insertion
(setq PT_10 (cdr (assoc 10 (reverse OBJ))))

; Mémorisatiobn des pointeurs
(setq OBJ_1 (entget (cdr (assoc 330 OBJ))))

; traitement pour tracer la ligne d'axe

(TraiteObj obj_1 360 obj PT_10)

(setq index_S (1+ index_S))

) ;repeat
)
) ;if

; Les lignes d'axes ont été créées, on les joint ensemble pour créer des polylignes 2D ou 3D

(setq X_LignesAxes
(ssget "x"
(list (cons 0 "LINE")
(cons 8 "AP3D_Axes_Tuyauterie")
)
)
)
(initcommandversion)
(command "_join" X_LignesAxes "")

; Remise des paramètres de départ

(setvar "osmode" osmode)
(setvar "clayer" CalqueCourant)
(command "_UCS" "_p")

(princ)
)

;|
==========================
Création des lignes d'axe
==========================
|;

(defun TraiteObj (Obj1x Codedxf objx PT_10x / PT_S1
PT_S2 PT_S3 PT_S4 PT_S5 PT_S6 index
OBJ_2
)

;; Tyuyau = (0 . "ACPPPIPE")
;; PT_10 et PT_11 existe

;; Composants = (0 . "ACPPPIPEINLINEASSET") ou (0 . "ACPPCONNECTOR")

(setq index 0)
(setq PT_S1 nil
PT_S2 nil
PT_S3 nil
PT_S4 nil
PT_S5 nil
PT_S6 nil
)

; si l'objet PLANT 3D est un tuyau on récupére les coordonnées des ports S1 et S2
; directement dals la liste des clés primaires

(if (= (cdr (assoc 0 objx)) "ACPPPIPE")
(progn
(setq pt_s1 (cdr (assoc 10 (reverse objx)))
pt_s2 (cdr (assoc 11 (reverse objx)))
)
(if (> (distance pt_s1 pt_s2) 0)
(command "_line" pt_s1 pt_s2 "")
)
)

; Sinon on recherche les ports S1, S2, ... depuis un nouveau pointeur
; une fois les ports S1, S2, ... trouvés on récupère la coordonnées du port
(progn

(setq OBJ_2 (entget (cdr (assoc Codedxf OBJ1x))))

; on boucle sur la liste pour récupérer la coordonnées du port

(repeat (length OBJ_2)

(if (= (cdr (nth index OBJ_2)) "S1")
(if (= PT_S1 nil)
(setq PT_S1 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S2")
(if (= PT_S2 nil)
(setq PT_S2 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S3")
(if (= PT_S3 nil)
(setq PT_S3 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S4")
(if (= PT_S4 nil)
(setq PT_S4 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S5")
(if (= PT_S5 nil)
(setq PT_S5 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S6")
(if (= PT_S6 nil)
(setq PT_S6 (cdr (nth (1+ index) OBJ_2)))
)
)

(setq index (1+ index))

) ;repeat

; Si la coordonnée du port existe alors on trace une ligne d'axe
; du point d'insertion ou point du port

(if (and (/= pt_s1 nil) (> (distance pt_10 pt_s1) 0))
(command "_line" pt_10 pt_s1 "")
)

(if (and (/= pt_s2 nil) (> (distance pt_10 pt_s2) 0))
(command "_line" pt_10 pt_s2 "")
)

(if (and (/= pt_s3 nil) (> (distance pt_10 pt_s3) 0))
(command "_line" pt_10 pt_s3 "")
)

(if (and (/= pt_s4 nil) (> (distance pt_10 pt_s4) 0))
(command "_line" pt_10 pt_s4 "")
)

(if (and (/= pt_s5 nil) (> (distance pt_10 pt_s5) 0))
(command "_line" pt_10 pt_s5 "")
)

(if (and (/= pt_s6 nil) (> (distance pt_10 pt_s6) 0))
(command "_line" pt_10 pt_s6 "")
)

)
) ;if

(princ)

) ;defun

;|
Efface tous les objets placés sur le calque "AP3D_Axes_Tuyauterie"
|;

(defun c:AP3D_EffacerAxesT ()

(command "_erase"
(ssget "x" (list (cons 8 "AP3D_Axes_Tuyauterie")))
""
)
(princ)
)

Convertir des blocs AutoCAD en équipements divers Plant 3D

La création d’un équipement ne nécessite pas obligatoirement des objets 3D. Une simple ligne peut être convertie en équipement. Ce qui veut dire que si on effectue des filtres de recherche sur des calques, des matériaux et autres il y a peut être un risque de se retrouver avec des conversions incohérentes sauf si un calque ou un type de matériaux correspond à un ensemble d’objet pour un et un seul équipement.

Toutefois la sélection en masse pour la création d’équipements est possible car la commande « _-PlantEquipmentConvert » peut être utilisée en tant que ligne de commande pour qu’elle n’ouvre pas la fenêtre de sélection de la classe..

Voici un petit programme AutoLisp vite fait qui converti une sélection de blocs AutoCAD  en « Equipement divers » Plant 3D.

;; Conversion blocs en équipement divers Plant 3D
;; Dominique VAQUAND 22.05.2020
;; www.dominique-vaquand.com

(defun c:Ap3D_BlocsEnEquipementDivers ( / SelectionObjets Index Bloc_Ent Bloc_Position)

(princ "\nBlocs à convertir en équipement divers Plant 3D: ")
(setq SelectionObjets (ssget (list (cons 0 "INSERT") )))

(setq Index 0)

(repeat (sslength SelectionObjets)
(setq Bloc_Ent (ssname SelectionObjets index))
(setq Bloc_Position (cdr (assoc 10 (entget Bloc_Ent))))
(command "_-PlantEquipmentConvert" Bloc_Ent "" "_MiscEquipment" Bloc_Position)
(setq index (1+ index))
)
(princ)
)

AP3_BlocsEnEquipementDivers.zip (340 téléchargements )

***************************************************************************

Mise à jour des vues orthographiques

Vous avez peut-être constaté que la mise à jour des vues orthographiques ne se faisait que vue par vue au risque d’oublier de mettre à jour une vue si la mise en page en contient beaucoup.

Voici un petit programme AutoLisp qui sélectionne toutes les fenêtres de la mise en page et les met à jour en fonction de la modélisation 3D.

Si la modélisation 3D n’a pas été sauvegardée au préalable, un message apparaîtra pour vous demander de confirmer ou non la mise à jour de la fenêtre, sinon la mise à jour se fera automatiquement en n’oubliant aucune fenêtre.

Si une nomenclature existe, elle se mettra également à jour.

Voici le code du programme :


;;; Mise à jour des fenêtres de vues orthographiques
;;; Dominique VAQUAND 04.07.2020
;;; www.dominique-vaquand.com

(defun c:AP3D_MajVueOrtho (/ i ii Select_Fenetres Select_Nomenclatures Ent_F Ent_N)

(if (setq i -1 Select_Fenetres (ssget "_X" '((0 . "VIEWPORT"))))
(while (setq Ent_F (ssname Select_Fenetres (setq i (1+ i))))
(command "_PLANTORTHOUPDATE" Ent_F)
)
)
;; Normalement la nomenclature est mise à jour dès que la fenêtre l'a été.
;; Deux précautions valent mieux qu'une, on met à jour les nomenclatures!
(if (setq ii -1 Select_Nomenclatures (ssget "_X" '((0 . "ACAD_TABLE"))))
(while (setq Ent_N (ssname Select_Nomenclatures (setq ii (1+ ii))))
(command "_PLANTORTHOUPDATEBOM" Ent_N)
)
)

(princ)
)

AP3D_MajVueOrtho.zip (268 téléchargements )

***************************************************************************

Gérer les objets invisibles

Lorsqu’on rend invisible des objets par la commande PLANTHIDE il est difficile, voir même impossible de savoir quel sont les objets concernés
et combien il y en a.

Voici la commande AP3_LISTEDESOBJETSCACHES qui permet de lister tous ces objets là, de les localiser et même d’en rendre certains visibles.

AP3D_ListeDesObjetsCaches.zip (263 téléchargements )

***************************************************************************

AP3D Liste des fichiers DWG d’un projet AutoCAD Plant 3D

L’application AP3D_ListeDesDwgDunProjet permet de lister tous les fichiers DWG contenu dans un projet AutoCAD Plant 3D, de visualiser les indices de révisions (s’ils ont été notés), les auteurs et les dates d’enregistrement.

Une sortie d’un état avec impression ou PDF est possible.

Cette application fonctionne sur des projets créés sur une base de données SQLite et ne nécessite pas AutoCAD Plant 3D.

AP3D_ListeDesDwgDunProjet_SQLite.zip (688 téléchargements )